2009-10-28 4 views
12

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

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

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

ответ

13

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

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

-8

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

+4

Я не счел бы это неправильным вопросом. Хотя CoreData использует SQLite для * базового * хранилища, у вас нет никакого интерфейса с SQLite. Вместо этого власть CoreData происходит от его классов и методов. Например, 'NSFetchedResultsController' при использовании с' UITableView' поможет эффективно считывать данные с диска по мере необходимости и соответственно управлять памятью. Вы, по сути, остаетесь делать это самостоятельно, если используете прямой SQLite. – jbrennan

+0

Где находится SQLite API при использовании Core Data? Насколько я могу судить, он все еще там. –

+1

Мне все равно, могу ли я получить доступ к обоим сразу (возможно, плохая идея, когда Core Data управляет вашими объектами). Я хочу использовать его и знать, какой из них лучше. – Christian

2

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

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

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

+0

Я добавил информацию о том, что в одной из таблиц может быть до 3000 записей. Если бы я легко мог решить самостоятельно, мне не нужно будет спрашивать здесь. Но зная, что нет больших недостатков, помогает. – Christian

2

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

+0

Ах, не думал об этом. Они реляционные. Это похоже на «станция принадлежит маршруту, который принадлежит транспортному средству». Это не оптимально для plists, не так ли? – Christian

+0

Зависит. Является ли она строго иерархической или существуют отношения «многие-ко-многим»? Плис делает первое прекрасно, но последнее сложнее. –

+0

Да, существует много-ко-многим отношениям. Поэтому мне лучше не ходить с плитами. Большое спасибо! – Christian

10

Вот простой способ предварительной загрузки хранилища основных данных с использованием 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]; 
} 
Смежные вопросы