Подтвердить что ты не робот

Являются ли основные данные полезными для данных только для чтения?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

alt text 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];
}

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Основные данные используют SQLite (среди других вариантов), поэтому ваш вопрос несколько испорчен.