Upload
andrew-yaroshevsky
View
4.726
Download
3
Embed Size (px)
Citation preview
Хранение данных в iPhone SQLite, FMDB,
SQLitePersistenceObjects, CoreData
Где можно хранить данные
• NSUserDefaults • SQLite
• На сервере ;) • В файлах со своим форматом • Включаем фантазию
NSUserDefaults
• Небольшой набор данных, не предполагающий запросов
• Примитивные типы данных – NSString, NSNumber, NSDate, NSArray, NSData, NSDiceonary
• Другие типы данных нуждаются в сериализации / десериализации NSObject <‐> NSData
NSUserDefaults
// Находим хранилищеNSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
// Записываем данные[standardUserDefaults setObject:myString forKey:@"Prefs"];
// Сохраняем[standardUserDefaults synchronize];
Пример кода
NSUserDefaults
Preferences
NSDic-onary
SoundPrefs
NSDic-onary
PlayingFile
NSString
Input URL
NSString
Playing File
NSData
GraphicalPrefs
NSDic-onary …
SQLite
• Библиотека, написанная на C • Поддерживает большую часть SQL92, включая транзакции и триггеры
• Хранит данные в файле • Открытый исходный код
iPhone + SQLite = libsqlite3
• Низкоуровневый код на C • Отсутствие ООП
• Создание таблиц и зависимостей между ними – задача программиста
• Сериализация сложных объектов и связей – задача ... того же программиста
libsqlite3
// Открываем БДif (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK) {
// Готовим запроссonst char *sql = "select coffeeID, coffeeName from сoffee";
Пример кода
libsqlite3
// Еще раз готовим запросif(sqlite3_prepare_v2(db, sql, -1, &selectstmt, NULL)
== SQLITE_OK) {
// Пока есть строки таблицы// Достаем все данныеwhile(sqlite3_step(selectstmt) == SQLITE_ROW) {NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);NSString * name = [NSString stringWithUTF8String: (char *)sqlite3_column_text(selectstmt, 1)]}
Пример кода
FMDB
• Обвертка над SQLite • Все еще полноценный SQL • За создание таблиц и зависимостей между ними, сериализацию отвечает программист
• Удобнее, чем libsqlite3
FMDB
// Открываем БДFMDatabase * db = [FMDatabase databaseWithPath:path];
// Записываем данные[db executeUpdate: @"insert into coffee values (?, ?)", @”1”, @”Vodka”];
Пример кода
FMDB
// Выполняем запросFMResultSet *rs = [db executeQuery:@"select coffeeID,coffeeName from coffee where coffeeID = ?", key];
// Забираем данныеif ([rs next]) { NSString * name = [rs stringForColumn:@"coffeeName "]; }
Пример кода
SQLite Persistent Objects
• Еще одна обвертка над SQLite • Полнофункциональная ORM
• Работа на уровне классов, а не на уровне таблиц базы данных
• За создание таблиц и зависимостей отвечает библиотека
• Полноценный SQL (сложно составлять вложенные запросы из‐за структуры базы)
SQLite Persistent Objects
#import "SQLitePersistentObject.h"// Всего пару строк, и у нас уже есть Entity@interface Coffee : SQLitePersistentObject { NSString *coffeeName;}
@property (nonatomic, retain) NSString *coffeeName;
@end
Пример кода
SQLite Persistent Objects
// Открываем БД[[SQLiteInstanceManager sharedManager] setDatabaseFilepath:@”db.sqlite"];
// Создаем и сохраняем данныеCoffee *newCoffee = [Coffee alloc] init];newCoffee.coffeeName = @”Cognac";[newCoffee save];
Пример кода
SQLite Persistent Objects
Coffee * coffee = [Coffee findFirstByCriteria: @"WHERE coffeeName = ’Burn’"];
Пример кода
Кроме этого • Поддержка связей один к одному, один ко многим, много ко многим • Поддержка transient свойств • Возможность сохранения некоторых классов в базу (UIImage, UIColor)
Core Data
• Framework из MacOS, в iPhone SDK с версии 3.0
• Поддерживает три вида хранилищ данных ‐ Binary, inMemory, SQLite
• Полнофункциональная ORM
• Работа на уровне классов • Язык запросов похож на SQL • Графический интерфейс для редактирования модели БД в Xcode
Core Data
Core Data
• Поддержка операций undo/redo на графе объектов
• Эффективная работа с табличными данными без полной загрузки их в память
• Валидация объектов на этапе сохранения • Контроль версий модели БД
Core Data
Core Data. Создание модели
GUI Код NSEntityDescription *runEntity =[[NSEntityDescription alloc]
init]; [runEntity setName:@"Run"]; [runEntity setManagedObjectClassName:@"Run"]; [mom setEntities:[NSArray arrayWithObject:runEntity]];
NSAttributeDescription *dateAttribute = [[NSAttributeDescription alloc] init];
[dateAttribute setName:@"date"];[dateAttribute setAttributeType:NSDateAttributeType];[dateAttribute setOptional:NO];NSExpression *lhs = [NSExpression
expressionForEvaluatedObject];NSExpression *rhs = [NSExpression expressionForConstantValue: [NSNumber numberWithInteger:0]];NSPredicate *validationPredicate = [NSComparisonPredicate
predicateWithLeftExpression:lhs rightExpression:rhs
modifier:NSDirectPredicateModifier
type:NSGreaterThanPredicateOperatorType options:0];
Или
Core Data
Core Data. Генерация классов
@interface Coffee: NSManagedObject {
}@property (nonatomic, retain) NSString * coffeeName;@property (nonatomic, retain) NSString * country;@end
@interface Coffee (CoreDataGeneratedAccessors)- (void)addCoffeeImageObject:(Image *)value;- (void)removeCoffeeImageObject:(Image *)value;- (void)addCoffeeImages:(NSSet *)value;- (void)removeCoffeeImage:(NSSet *)value;
@end
Core Data
Core Data. Генерация классов
// СоздаемCoffee * coffee = [NSEntityDescription insertNewObjectForEntityForName: [Coffee entityName] inManagedObjectContext:managedObjectContext];
coffee.coffeeName = @”Absinthe";// и сохраняем данныеNSError * error;if (![managedObjectContext save:&error]){ NSLog(@”Please don’t mix %@ with coffee : %@", [coffee
description], [error userInfo]);}
Core Data
Core Data. “Особенности”
• Местами все еще «сырая» документация • Логические ошибки в базовых классах
Core Data
Личное мнение
NSUserDefaults, если
• небольшое количество данных • отсутствуют сложные запросы
Core Data Framework, если
• необходимо работать с большими объемами информации
Спасибо за внимание! Тайкало Павел Email:�[email protected]
Skype:�.kilew