私はちょうどPersistentContainer
によって作成されたDBの場所がUIManagedDocument
によって作成されたDBから異なっていることを知ります。ここでUIManagedDocument
によるDBの場所のスナップショットです:
は、次のコードは、DBを作成するために使用されています
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
で作成できない理由を説明してくれますカスタマイズされたdbファイルを指定するか、フォルダが既に存在するためクラッシュする可能性があります。ここで
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です::上記の分析に基づいて
、あなたが持っている場合、私は、さらに次のようにファイル名「MyDb.sqlite」を付加することによって、これを検証しましたこのようなコードは:
if #available(iOS 10.0, *) {
// load db by using PersistentContainer
...
} else {
// Fallback on UIManagedDocument method to load db
...
}
ユーザーのデバイスは、10.0前と後で10+に更新されるiOSの上にあってもよいです。今回の変更では、クラッシュや新しい(空の)データベース(データの消失)の作成を避けるために、URLを調整する必要があります。
これは、CoreDataスタックを初期化するときではなく、store.sqliteがすでに存在する場合にのみ機能します。 – shallowThought
いいえ、ファイルが存在しない場合は正常に動作します。しかし、ファイルを移動するディレクトリが存在していなければならず、アプリケーショングループを正しく設定する必要があります。ただし、ストアファイルが既に存在する必要はありません。 –
奇妙な。ここでは、 "ファイルが見つかりません"というエラーが発生してクラッシュします。ファイルが既に存在する場合はうまく動作します。 – shallowThought