Полезны ли Core Data для данных только для чтения? - PullRequest
12 голосов
/ 28 октября 2009

Я создаю приложение для iPhone и задаюсь вопросом, лучше ли Core Data для данных только для чтения, чем база данных SQLite. Такое ощущение, что БД SQLite - лучший выбор, верно? Могу ли я предварительно заполнить Базовое хранилище данных?

В принципе мне нужно 3 таблицы с кучей (до 3000) сущностей в каждой. Затем я хочу перечислить данные в TableViews, выполнить поиск по ним или загрузить данные для других целей.

Должен ли я использовать базовые данные в этом случае?

Ответы [ 5 ]

13 голосов
/ 28 октября 2009

Если вы будете отображать данные только для чтения в табличном представлении, использование Core Data над SQLite может иметь значительные преимущества просто благодаря NSFetchedResultsController. Этот вспомогательный класс чрезвычайно упрощает отображение элементов базы данных в табличном представлении, и он может обрабатывать пакетные выборки для вас. Пакетная выборка позволяет вам загружать на экран только ту информацию, которая вам нужна, что значительно улучшает время загрузки и использование памяти для всех, кроме самых маленьких наборов данных.

Я использую Базовые данные для информации только для чтения, которую я отправляю в комплекте моего приложения по этой причине, наряду с тем, что я могу поделиться моделью данных с доступной для записи базой данных, хранящейся в данных приложения пользователя. Я рекомендую использовать Core Data, если вам абсолютно не нужно ориентироваться на устройства iPhone OS 2.x.

10 голосов
/ 26 июля 2010

Вот простой способ предварительной загрузки хранилища базовых данных с использованием списков.

Создать список свойств, содержащий массив словарей. Приведите ключи каждого словаря в соответствие с ключами вашего управляемого объекта.

альтернативный текст http://www.freeimagehosting.net/uploads/b0b1909e81.png

Затем вызовите этот метод при первом запуске приложения:

- (void)loadDataFromPropertyList {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"plist"];
    NSArray *items = [NSArray arrayWithContentsOfFile:path];

    NSManagedObjectContext *ctx = self.managedObjectContext;

    for (NSDictionary *dict in items) {
        NSManagedObject *m = [NSEntityDescription insertNewObjectForEntityForName:@"TheNameOfYourEntity" inManagedObjectContext:ctx];
        [m setValuesForKeysWithDictionary:dict];
    }

    NSError *err = nil;
    [ctx save:&err];

    if (err != nil) {
        NSLog(@"error saving managed object context: %@", err);
    }
}

Позвоните loadDataFromPropertyList при первом запуске приложения, включив следующий код в реализацию application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
if (![defaults objectForKey:@"firstRun"])
{
    [defaults setObject:[NSDate date] forKey:@"firstRun"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self loadDataFromPropertyList];
}
2 голосов
/ 28 октября 2009

Вы определенно можете поставить предварительно заполненное хранилище Core Data в своем приложении, точно так же, как вы могли бы заполнить предварительно заполненную базу данных SQLite или большой список всех ваших данных (хотя это звучит как плохо подходит для этого случая), или как угодно.

Базовые данные хороши тем, что это все нативное Какао, оно обрабатывает всю загрузку из БД в нативные объекты, безжалостно оптимизируется и так далее. Но есть также много кода, чтобы делать вещи, которые вас не волнуют: обработка ревизий, сохранение изменений, поддержка отмены и повторного выполнения и т. Д. Так что, на самом деле, не совсем правильный ответ так или иначе.

Многое будет зависеть от вашего уровня комфорта как с базовыми данными, так и с альтернативами. Довольны ли вы работой с API SQLite (или одним из множества оберток Какао ) для получения ваших данных? Если так, то это может быть проще. Если использование Core Data сделает ORM для вас большим успехом, тогда идите по этому пути. С другой стороны, сложные запросы с Core Data используют API-интерфейсы предикатов, которые могут быть более сложными, чем использование чистого SQL с SQLite. Такого рода вещи.

2 голосов
/ 28 октября 2009

В зависимости от того, насколько они реляционные, вам может быть лучше читать данные только для чтения из списка. Plist легко загружать / сохранять (они превращаются в NSDictionaries) и, вероятно, их легче редактировать

0 голосов
/ 28 октября 2009

Core Data использует SQLite (среди прочих опций), поэтому ваш вопрос несколько ошибочен

...