2016-08-10 5 views
1

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

+0

почему? какую выгоду вы думаете, что получите? работает ли ваше существующее SQL-решение правильно? есть ли что-то, чего он не может сделать? – Wain

ответ

2

Из основных данных documentation:

Как я могу использовать существующую базу данных SQLite с Core Data?

У вас нет, если вы не импортируете существующую базу данных SQLite в хранилище основных данных . Хотя Core Data поддерживает SQLite как один из его постоянных типов хранилищ , формат базы данных является закрытым. Вы не можете создать базу данных SQLite с использованием собственного SQLite API и использовать его непосредственно с Core Data. . Если у вас есть существующая база данных SQLite, вам необходимо импортировать ее в хранилище Core Data. Кроме того, не манипулировать существующий основные данные созданного SQLite магазина с использованием нативного SQLite API

Вы можете попробовать с помощью инструмента https://github.com/tapasya/Sqlite2CoreData, но это кажется довольно устареть.

1

Трудность в основном зависит от того, насколько хорошо настроена ваша архитектура кода. Нет простой процедуры для этого ... Добавление основных данных в проект, если они достаточно просты, понимая, что это совсем другое дело.

Вот несколько вещей, которые вы можете обратить внимание:

  • CoreData создать SQLite файл по-своему, то есть вы не можете кормить его любой .sqlite файл и надеяться на лучшее. Вы должны будете позволить CoreData создать свой собственный файл и перенести данные из вашего хранилища sqlite в основной файл данных.

  • Ваши таблицы становятся классами (как в большинстве ORM, это называется Entities), и вы не можете создавать экземпляр нового объекта напрямую, что означает, что если у вас есть таблица Employee, вы не можете выполнять Employee * john = [[Employee alloc] init ]; Этого не будет! Элемент Insert отвечает за класс NSEntityDescritpion. Так проверьте код для возможной ошибки там ...

Если основные данные немного к сложному, Realm является хорошей альтернативой ORM: https://realm.io/products/objc/

Успехов ...

2

Я думаю, @SaintThread попал в основную проблему. Причиной этого является то, что Core Data не является оболочкой SQLite - это другой API с различными предположениями, которые просто используют SQLite внутри. Core Data не пытается быть совместимым с тем, как вы будете использовать SQLite, если бы вы использовали SQLite самостоятельно.

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

При удалении существующего SQLite-файла обязательно удалите файлы журнала SQLite (если есть).

0

Вот как я нашел работу лучше всего; Но убедитесь, что вы используете хорошую обработку ошибок при бросках.

Это оригинальный путь от Apple:

https://developer.apple.com/library/content/samplecode/CoreDataBooks/Listings/Classes_CoreDataBooksAppDelegate_m.html#//apple_ref/doc/uid/DTS40008405-Classes_CoreDataBooksAppDelegate_m-DontLinkElementID_8

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataBooks.CDBStore"]; 

/* 
Set up the store. 
For the sake of illustration, provide a pre-populated default store. 
*/ 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
// If the expected store doesn't exist, copy the default store. 
if (![fileManager fileExistsAtPath:[storeURL path]]) { 
    NSURL *defaultStoreURL = [[NSBundle mainBundle] URLForResource:@"CoreDataBooks" withExtension:@"CDBStore"]; 
    if (defaultStoreURL) { 
     [fileManager copyItemAtURL:defaultStoreURL toURL:storeURL error:NULL]; 
    } 
} 

NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @YES, NSInferMappingModelAutomaticallyOption: @YES}; 
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

NSError *error; 
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 

....

Это новый способ - Xcode8

Swift 3 preload from SQL files in appDelegate

Core Data with pre-filled .sqlite (Swift3)

Why does not copy database.db from bundle to document directory in swift 3?

https://www.raywenderlich.com/145877/core-data-tutorial-multiple-managed-object-contexts-2

Смежные вопросы