24
Хранение данных в iPhone SQLite, FMDB, SQLitePersistenceObjects, CoreData

Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Embed Size (px)

Citation preview

Page 1: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Хранение данных в iPhone SQLite, FMDB, 

SQLitePersistenceObjects, CoreData 

Page 2: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Где можно хранить данные 

• NSUserDefaults • SQLite 

• На сервере ;) • В файлах со своим форматом • Включаем фантазию 

Page 3: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

NSUserDefaults 

•  Небольшой набор данных, не предполагающий запросов 

•  Примитивные типы данных – NSString, NSNumber, NSDate, NSArray, NSData, NSDiceonary 

•  Другие типы данных  нуждаются в сериализации / десериализации      NSObject <‐> NSData  

Page 4: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

NSUserDefaults 

// Находим хранилищеNSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

// Записываем данные[standardUserDefaults setObject:myString forKey:@"Prefs"];

// Сохраняем[standardUserDefaults synchronize];

Пример кода 

Page 5: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

NSUserDefaults 

Preferences 

NSDic-onary 

SoundPrefs 

NSDic-onary 

PlayingFile 

NSString 

Input URL 

NSString 

Playing File 

NSData 

GraphicalPrefs 

NSDic-onary  … 

Page 6: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

SQLite 

•  Библиотека, написанная на C •  Поддерживает большую часть SQL92, включая транзакции и триггеры 

•  Хранит данные в файле •  Открытый исходный код 

Page 7: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

iPhone + SQLite = libsqlite3 

•  Низкоуровневый код на C •  Отсутствие ООП 

•  Создание таблиц и зависимостей между ними – задача программиста 

•  Сериализация сложных объектов и связей – задача ... того же программиста 

Page 8: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

libsqlite3 

// Открываем БДif (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK) {

// Готовим запроссonst char *sql = "select coffeeID, coffeeName from сoffee"; 

Пример кода 

Page 9: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

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)]} 

Пример кода 

Page 10: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

FMDB 

• Обвертка над SQLite • Все еще полноценный SQL • За создание таблиц  и зависимостей между ними, сериализацию отвечает программист 

• Удобнее, чем libsqlite3 

Page 11: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

FMDB 

// Открываем БДFMDatabase * db = [FMDatabase databaseWithPath:path];

// Записываем данные[db executeUpdate: @"insert into coffee values (?, ?)", @”1”, @”Vodka”];  

Пример кода 

Page 12: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

FMDB 

// Выполняем запросFMResultSet *rs = [db executeQuery:@"select coffeeID,coffeeName from coffee where coffeeID = ?", key];

// Забираем данныеif ([rs next]) { NSString * name = [rs stringForColumn:@"coffeeName "]; }

Пример кода 

Page 13: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

SQLite Persistent Objects 

•  Еще одна обвертка над SQLite •  Полнофункциональная ORM  

•  Работа на уровне классов, а не на уровне таблиц базы данных 

•  За создание таблиц и зависимостей отвечает библиотека 

•  Полноценный SQL  (сложно составлять вложенные запросы из‐за структуры базы) 

Page 14: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

SQLite Persistent Objects 

#import "SQLitePersistentObject.h"// Всего пару строк, и у нас уже есть Entity@interface Coffee : SQLitePersistentObject { NSString *coffeeName;}

@property (nonatomic, retain) NSString *coffeeName;

@end

Пример кода 

Page 15: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

SQLite Persistent Objects 

// Открываем БД[[SQLiteInstanceManager sharedManager] setDatabaseFilepath:@”db.sqlite"];

// Создаем и сохраняем данныеCoffee *newCoffee = [Coffee alloc] init];newCoffee.coffeeName = @”Cognac";[newCoffee save];

Пример кода 

Page 16: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

SQLite Persistent Objects 

Coffee * coffee = [Coffee findFirstByCriteria: @"WHERE coffeeName = ’Burn’"]; 

Пример кода 

Кроме этого •  Поддержка связей один к одному, один ко многим, много ко многим •  Поддержка transient свойств •  Возможность сохранения некоторых классов в базу (UIImage, UIColor) 

Page 17: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Core Data 

•  Framework из MacOS, в iPhone SDK с версии 3.0 

•  Поддерживает три вида хранилищ данных ‐   Binary, inMemory, SQLite 

•  Полнофункциональная ORM 

•  Работа на уровне классов •  Язык запросов похож на SQL •  Графический интерфейс для редактирования модели БД в Xcode  

Core Data 

Page 18: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Core Data 

•  Поддержка операций undo/redo на графе объектов 

•  Эффективная работа с табличными данными без полной загрузки их в память 

•  Валидация объектов на этапе сохранения •  Контроль версий модели БД 

Core Data 

Page 19: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

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 

Page 20: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

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 

Page 21: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

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 

Page 22: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Core Data. “Особенности” 

• Местами все еще «сырая» документация •  Логические ошибки в базовых классах 

Core Data 

Page 23: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Личное мнение 

NSUserDefaults, если  

•  небольшое количество данных •  отсутствуют сложные запросы 

Core Data Framework, если  

•  необходимо работать с большими объемами информации 

Page 24: Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)

Спасибо за внимание! Тайкало Павел Email:�[email protected] 

Skype:�.kilew