ich herausfinden, dass die Lage von db erstellt von PersistentContainer
unterscheidet sich von db von UIManagedDocument
erstellt. Hier ist eine Momentaufnahme der db Lage von UIManagedDocument
:
und die folgenden Codes werden verwendet, um die DB zu erstellen:
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)
}
Es sieht aus wie, dass die db bezeichnet durch PersistentContainer
ist eigentlich die Datei weiter unten unter dem Ordner "StoreContent" als "persistentStore"
Dies kann erklären, warum die db "defaultDatabase" in meinem Fall nicht von PersistentContainer
erstellt werden kann, wenn Sie möchten um die benutzerdefinierte db-Datei anzugeben oder einen Absturz zu verursachen, da der Ordner bereits existiert. Ich überprüfte diese weiter durch einen Dateinamen „MyDb.sqlite“ wie folgt angehängt:
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() { ... }
Hier ist die neue MyDb.sqlite:
Basierend auf der obigen Analyse, wenn Sie Codes wie folgt:
if #available(iOS 10.0, *) {
// load db by using PersistentContainer
...
} else {
// Fallback on UIManagedDocument method to load db
...
}
Benutzer Gerät kann auf iOS Pre 10.0 und später auf 10+ aktualisiert werden. Für diese Änderung denke ich, dass die URL angepasst werden muss, um entweder einen Absturz zu vermeiden oder eine neue (leere) Datenbank zu erstellen (Datenverlust).
Dies scheint nur zu funktionieren, wenn die store.sqlite bereits existiert, nicht während der Initialisierung des CoreData Stacks. – shallowThought
Nein, es funktioniert gut, wenn die Datei nicht existiert. Das Verzeichnis, in das die Datei verschoben werden soll, muss jedoch vorhanden sein, und Ihre App-Gruppe muss ordnungsgemäß eingerichtet sein. Die Store-Datei muss jedoch nicht bereits vorhanden sein. –
Seltsam. Es stürzt hier mit dem Fehler "Datei nicht gefunden" ab. Funktioniert gut, wenn die Datei bereits existiert. – shallowThought