2016-08-10 254 views
1

我有它使用的SQLite 數據庫,現在不會破壞應用程序的下一個更新我想在應用程序加載到執行核心數據從.sqlite文件的所有數據的App Store的現場應用。我一直在閱讀教程,但沒有多大幫助。我不知道如何繼續。請指點我正確的方向。的SQLite到核心數據遷移

+0

爲什麼呢?你認爲你會得到什麼好處?現有的SQL解決方案是否正常工作?有什麼不能做的嗎? – Wain

回答

2

從核心數據documentation

如何使用現有的SQLite數據庫核心數據?

除非將現有的SQLite數據庫導入 核心數據存儲區,否則您不這樣做。雖然Core Data支持SQLite作爲其持久存儲類型之一,但數據庫格式是私有的。你不能用 創建一個使用原生SQLite API的SQLite數據庫,並直接在覈心數據中使用它 。如果您有一個現有的SQLite數據庫,您需要將其導入到Core Data存儲中。此外,不要 使用原生 SQLite的API

您可以使用該工具https://github.com/tapasya/Sqlite2CoreData嘗試操作一個現有的核心數據創建的SQLite的商店,但它似乎相當過時。

1

難度主要取決於您的代碼架構設置得如何。沒有簡單的程序來做到這一點...... 如果相當簡單,將Core數據添加到項目中,理解它是另一回事。

這裏,你可能要注意幾件事:

  • CoreData以自己的方式創建sqlite的文件,這意味着你不能給它任何.sqlite文件,並希望最好的。您將不得不讓CoreData創建自己的文件,並將數據從sqlite存儲轉移到核心數據。

  • 你的表成爲類(就像在大多數ORM中,它被稱爲實體),你不能直接實例化一個新的實體,這意味着如果你有一個表Employee,你不能這樣做Employee * john = [[Employee alloc] init ]。那不會!插入元素是NSEntityDescritpion類的職責。因此,檢查你的可能的錯誤代碼,有...

如果核心數據是有點複雜的,境界是一個很好的替代ORM:https://realm.io/products/objc/

好運...

2

我想@SaintThread在這裏遇到了主要問題。其原因是Core Data不是SQLite的包裝 - 它是一個不同的API,它有不同的假設,恰好在內部使用SQLite。如果你自己使用SQLite,核心數據不會與你如何使用SQLite兼容。這就是說,如果你仍然想遷移,你將不得不設計一個核心數據模型,然後編寫完全自定義的代碼從現有的SQLite文件遷移到核心數據。您的代碼需要從SQLite讀取所有內容,將其轉換爲新的Core Data表示,保存更改,然後刪除現有的SQLite文件。

刪除現有SQLite文件時,請確保也刪除SQLite日記文件(如果有)。

0

以下是我找到工作最好的方式;但請確保您在投擲中使用良好的錯誤處理。

這是來自蘋果的原始的方式:

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