Хранение данных в 
     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 
                                    PlayingFile 
                                     NSString 

                   SoundPrefs       Input URL 
Preferences       NSDic-onary        NSString 
NSDic-onary 
                                    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 

                 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. “Особенности” 
•  Местами все еще «сырая» документация 
•  Логические ошибки в базовых классах 
Личное мнение 
NSUserDefaults, если  
•  небольшое количество данных 
•  отсутствуют сложные запросы 

Core Data Framework, если  
•  необходимо работать с большими объемами 
   информации 
Спасибо за внимание! 
Тайкало Павел 
Email:•.kilew@gmail.com 
Skype:•.kilew 

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

  • 1.
    Хранение данных в  iPhone  SQLite, FMDB,  SQLitePersistenceObjects, CoreData 
  • 2.
    Где можно хранить данные  •  NSUserDefaults  •  SQLite  • На сервере ;)  •  В файлах со своим форматом  •  Включаем фантазию 
  • 3.
    NSUserDefaults  •  Небольшой набор данных, не  предполагающий запросов  •  Примитивные типы данных – NSString,  NSNumber, NSDate, NSArray, NSData,  NSDiceonary  •  Другие типы данных  нуждаются в  сериализации / десериализации       NSObject <‐> NSData  
  • 4.
    NSUserDefaults  Пример кода  // Находим хранилище NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; // Записываем данные [standardUserDefaults setObject:myString forKey:@"Prefs"]; // Сохраняем [standardUserDefaults synchronize];
  • 5.
    NSUserDefaults  PlayingFile  NSString  SoundPrefs  Input URL  Preferences  NSDic-onary  NSString  NSDic-onary  Playing File  NSData  GraphicalPrefs  NSDic-onary  … 
  • 6.
    SQLite  •  Библиотека, написанная на C  •  Поддерживает большую часть SQL92,  включая транзакции и триггеры  •  Хранит данные в файле  •  Открытый исходный код 
  • 7.
    iPhone + SQLite = libsqlite3  •  Низкоуровневый код на C  •  Отсутствие ООП  • Создание таблиц и зависимостей между  ними – задача программиста  •  Сериализация сложных объектов и связей –  задача ... того же программиста 
  • 8.
    libsqlite3  Пример кода  // Открываем БД if (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK) { // Готовим запрос сonst char *sql = "select coffeeID, coffeeName from сoffee"; 
  • 9.
    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)] } 
  • 10.
    FMDB  •  Обвертка над SQLite  •  Все еще полноценный SQL  • За создание таблиц  и зависимостей  между ними, сериализацию отвечает  программист  •  Удобнее, чем libsqlite3 
  • 11.
    FMDB  Пример кода  // Открываем БД FMDatabase * db = [FMDatabase databaseWithPath:path]; // Записываем данные [db executeUpdate: @"insert into coffee values (?, ?)", @”1”, @”Vodka”];  
  • 12.
    FMDB  Пример кода  // Выполняем запрос FMResultSet *rs = [db executeQuery: @"select coffeeID,coffeeName from coffee where coffeeID = ?", key]; // Забираем данные if ([rs next]) { NSString * name = [rs stringForColumn:@"coffeeName "]; }
  • 13.
    SQLite Persistent Objects  •  Еще одна обвертка над SQLite  •  Полнофункциональная ORM   • Работа на уровне классов, а не на уровне  таблиц базы данных  •  За создание таблиц и зависимостей  отвечает библиотека  •  Полноценный SQL  (сложно составлять  вложенные запросы из‐за структуры базы) 
  • 14.
    SQLite Persistent Objects  Пример кода  #import "SQLitePersistentObject.h" // Всего пару строк, и у нас уже есть Entity @interface Coffee : SQLitePersistentObject { NSString *coffeeName; } @property (nonatomic, retain) NSString *coffeeName; @end
  • 15.
    SQLite Persistent Objects  Пример кода  // Открываем БД [[SQLiteInstanceManager sharedManager] setDatabaseFilepath:@”db.sqlite"]; // Создаем и сохраняем данные Coffee *newCoffee = [Coffee alloc] init]; newCoffee.coffeeName = @”Cognac"; [newCoffee save];
  • 16.
    SQLite Persistent Objects  Пример кода  Coffee * coffee = [Coffee findFirstByCriteria: @"WHERE coffeeName = ’Burn’"];  Кроме этого  • Поддержка связей один к одному, один ко многим,    много ко многим  • Поддержка transient свойств    • Возможность сохранения некоторых классов в базу    (UIImage, UIColor) 
  • 17.
    Core Data  Core Data  •  Framework из MacOS, в iPhone SDK с версии 3.0  •  Поддерживает три вида хранилищ данных ‐    Binary, inMemory, SQLite  •  Полнофункциональная ORM  •  Работа на уровне классов  •  Язык запросов похож на SQL  •  Графический интерфейс для редактирования  модели БД в Xcode  
  • 18.
    Core Data  Core Data  •  Поддержка операций undo/redo на графе  объектов  •  Эффективная работа с табличными  данными без полной загрузки их в память  •  Валидация объектов на этапе сохранения  •  Контроль версий модели БД 
  • 19.
    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]; 
  • 20.
    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 
  • 21.
    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]); }
  • 22.
    Core Data  Core Data. “Особенности”  •  Местами все еще «сырая» документация  •  Логические ошибки в базовых классах 
  • 23.
  • 24.