2013-06-27 4 views
3

Я создал базу данных SQLite, содержащую записи из некоторого JSON, используя this tutorial, и я хочу использовать MagicalRecord для его запроса.Использование существующей базы данных SQLite в MagicalRecord

MagicalRecord видит NSManagedObject (BlogPost) и может создавать записи, но он не видит предварительно заполненные записи, поэтому я предполагаю, что он не видит файл SQLite, который я добавил. Я проверил, что база данных SQLite действительно содержит строки с использованием клиента SQLite.

В application:didFinishLaunchingWithOptions:, я поставил:

[MagicalRecord setupCoreDataStackWithStoreNamed:@"DBG.sqlite"]; 

И в applicationWillTerminate::

[MagicalRecord cleanUp]; 

Когда я звоню [BlogPost MR_findAll] в контроллере, он возвращает пустой набор. DBG.sqlite находится в корне каталога проекта, и я попытался поместить его в «Copy Bundle Resources», но blogPosts по-прежнему возвращает пустой набор.

Любые идеи?

+1

Это SQLite-файл, связанный с определением модели Core Data? Как вы его создали? – Wain

+0

Я создал его с помощью учебника, связанного в вопросе. (В основном, я сделал инструмент командной строки, который использует модели Core Data в моем основном приложении (приложение, описанное в вопросе), чтобы преобразовать JSON в записи Core Data, а затем скопировал полученный SQLite-файл в основное приложение.) Я неправильно предполагая, что 'setupCoreDataStackWithStoreNamed:' является способом подключения Core Data к существующему хранилищу данных? – Tom

+0

Вы каким-либо образом изменили модель с момента создания файла sqlite? – Wain

ответ

13

Проблема закончилась тем, что предварительно загруженное SQLite БД должен быть скопирован в папку по умолчанию БД приложения:

NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; 
NSURL *documentPath = [paths lastObject]; 

NSURL *storeURL = [documentPath URLByAppendingPathComponent:@"DBG.sqlite"]; 

if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) { 
    NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"DBG" ofType:@"sqlite"]]; 
    NSError* err = nil; 

    if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) { 
     NSLog(@"Error: Unable to copy preloaded database."); 
    } 
} 

Это должны быть помещены непосредственно перед [MagicalRecord setupCoreDataStackWithStoreNamed:@"DBG.sqlite"];.

+0

Жаль, что я мог бы дать сто пальцев вверх, спасибо! – dreampowder

+0

Вышеупомянутое решение не работало для предварительно заполненных данных ядра, пока я не изменил 'setupCoreDataStackWithStoreNamed' на' setupCoreDataStackWithAutoMigratingSqliteStoreNamed' – Tarun