• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 

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

on

  • 6,072 views

 

Statistics

Views

Total Views
6,072
Views on SlideShare
5,670
Embed Views
402

Actions

Likes
0
Downloads
17
Comments
0

5 Embeds 402

http://www.iphonedev.com.ua 330
http://iphonedevcamp.com.ua 49
http://www.slideshare.net 12
http://feeds2.feedburner.com 10
http://feeds.feedburner.com 1

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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