Использование существующей базы данных SQLite в MagicalRecord

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

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

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

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

И в applicationWillTerminate::

[MagicalRecord cleanUp];

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

Любые идеи?


person Tom    schedule 27.06.2013    source источник
comment
Подключен ли ваш файл SQLite к вашему определению модели Core Data? Как вы его создали?   -  person Wain    schedule 27.06.2013
comment
Я создал его, используя учебник, указанный в вопросе. (По сути, я создал инструмент командной строки, который использует модели Core Data в моем основном приложении (приложение, описанное в вопросе) для преобразования JSON в записи Core Data, а затем скопировал полученный файл SQLite в мое основное приложение.) Я неправильно предполагая, что setupCoreDataStackWithStoreNamed: — это способ подключения Core Data к существующему хранилищу данных?   -  person Tom    schedule 28.06.2013
comment
Изменили ли вы модель каким-либо образом после создания файла sqlite?   -  person Wain    schedule 28.06.2013
comment
Нет, вообще не трогал.   -  person Tom    schedule 28.06.2013
comment
По умолчанию MR ведет много журналов, поэтому там должна быть какая-то подсказка, если у него возникла проблема. Обычно (в режиме отладки), если предоставленный вами файл sqlite не соответствует версии модели данных, он будет удален.   -  person Wain    schedule 28.06.2013
comment
Я не смог найти ничего полезного в журнале, но я также не очень хорошо знаком с Core Data. Я разместил журнал отладки здесь на случай, если он будет полезен.   -  person Tom    schedule 28.06.2013
comment
Перейдите к NSPersistentStoreCoordinator+MagicalRecord.m и выполните отладку через MR_addSqliteStoreNamed:withOptions: проверку на наличие ошибок. Кроме того, вы проверили наличие других сущностей в магазине?   -  person Wain    schedule 28.06.2013
comment
Вы поняли это потом? Это именно то, что я тоже хотел бы сделать. Я создал служебное приложение, которое берет XML-документ и выгружает его в основные данные. Теперь я хочу предварительно заполнить другое приложение файлом coredata/sqlite.   -  person Shannon Cole    schedule 28.06.2013
comment
Спасибо за подсказки, @Wain! Проблема оказалась не связанной с MR (подробности см. В ответе).   -  person Tom    schedule 01.07.2013


Ответы (1)


Проблема оказалась в том, что предварительно загруженную базу данных 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"];.

person Tom    schedule 01.07.2013
comment
Приведенное выше решение не работало для предварительно заполненных основных данных, пока я не изменил setupCoreDataStackWithStoreNamed на setupCoreDataStackWithAutoMigratingSqliteStoreNamed. - person Tarun; 25.06.2014