我剛剛發現,由PersistentContainer
創建數據庫的位置是從數據庫通過UIManagedDocument
創建不同的。下面是UIManagedDocument
分貝位置的快照:
和下面的代碼用於創建數據庫:
let fileURL = db.fileURL // url to ".../Documents/defaultDatabase"
let fileExist = FileManager.default.fileExists(atPath: fileURL.path)
if fileExist {
let state = db.documentState
if state.contains(UIDocumentState.closed) {
db.open()
}
} else {
// Create database
db.save(to: fileURL, for:.forCreating)
}
它看起來像由PersistentContainer
簡稱分貝實際上是文件在文件夾「StoreContent」下作爲「persistentStore」
這可以解釋爲什麼在我的情況下db「defaultDatabase」不能被PersistentContainer
創建,如果你想要指定您的自定義數據庫文件,或導致崩潰,因爲文件夾已經存在。我進一步證實了這一附加一個文件名「MyDb.sqlite」是這樣的:
let url = db.fileURL.appendingPathComponent("MyDb.sqlite")
let storeDesription = NSPersistentStoreDescription(url: url)
container.persistentStoreDescriptions = [storeDesription]
print("store description \(container.persistentStoreDescriptions)"
// store description [<NSPersistentStoreDescription: 0x60000005cc50> (type: SQLite, url: file:///Users/.../Documents/defaultDatabase/MyDb.sqlite)
container.loadPersistentStores() { ... }
這是新MyDb.sqlite:
基於上述分析,如果你有這樣的代碼:
if #available(iOS 10.0, *) {
// load db by using PersistentContainer
...
} else {
// Fallback on UIManagedDocument method to load db
...
}
用戶的設備可能在iOS 10.0之前,並且以後更新到10+。對於這個改變,我認爲url必須被調整以避免崩潰或者創建一個新的(空的)db(丟失數據)。
這似乎只適用於,如果store.sqlite已經存在,而不是初始化CoreData堆棧。 – shallowThought
不,它工作正常,如果該文件不存在。但是,您想要文件的目錄必須存在,並且您的應用程序組需要正確設置。不過,沒有要求存儲文件已經存在。 –
奇怪。它與「找不到文件」錯誤在這裏崩潰。如果文件已經存在,可以正常工作。 – shallowThought