我有一個核心數據數據庫,我希望預先填充而無需在首次啓動時加載所有數據。我試圖通過創建第二個應用程序來負責加載並將SQL數據庫從該應用程序複製到新應用程序。起初我想簡單地.sqlite
文件從第二個應用程序拷貝和複製文件到這樣的第一個應用程序:將核心數據數據庫從一個應用程序遷移到另一個應用程序
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "GeoPointDB")
let seededData: String = "GeoPointDB"
var persistentStoreDescriptions: NSPersistentStoreDescription
let storeUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!
if !FileManager.default.fileExists(atPath: (storeUrl.path)) {
let seededDataUrl = Bundle.main.url(forResource: seededData, withExtension: "sqlite")
try! FileManager.default.copyItem(at: seededDataUrl!, to: storeUrl)
}
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeUrl)]
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error {
fatalError("Unresolved error \(error),")
}
})
return container
}()
然而,這給了我一個錯誤信息:「無法打開數據庫文件」。研究了一下,我發現這篇文章: https://developer.apple.com/library/content/qa/qa1809/_index.html
因此,我又回到了第二個應用程序,並試圖通過使用此代碼正確導出數據庫:
let documents = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!
do {
try context.persistentStoreCoordinator!.migratePersistentStore(context.persistentStoreCoordinator!.persistentStores.first!, to: documents, options: nil, withType: NSSQLiteStoreType)
print("Managed to save database file")
} catch let error as NSError {
print("Failed to save DB: \(error)")
}
但我做到這一點時,我得到確切同樣的錯誤出口當試圖加載複製的數據庫到第一個應用程序:「無法打開數據庫文件」。關於我在做什麼錯誤的任何提示或如何使用iOS 10/11和Swift 3/4執行數據庫遷移?
,可能是有用的一些額外的信息:
- 這兩個應用程序都從項目創建Xcode的「使用核心數據」選項標準CoreData代碼
- 在第一個應用程序的CoreData模型(
.xcdatamodeld
文件)從第二應用程序複製到確保不存在任何矛盾 - 我能夠從第二應用程序的數據庫沒有任何問題的增加和獲取數據