📑
CoreDataのNSPersistentStoreCoordinatorエラーの解決方法
CoreDataのNSPersistentStoreCoordinatorエラーの解決方法
発生したエラー
CoreData: error: Illegal attempt to save to a file that was never opened.
"This NSPersistentStoreCoordinator has no persistent stores (unknown).
It cannot perform a save operation."
問題のコード
enum PlaylistRepositoryKey: DependencyKey {
static let liveValue: any PlaylistRepository = CoreDataPlaylistRepository(
context: NSPersistentContainer(name: "VoiLog").viewContext
)
}
原因
このエラーは、CoreDataの永続ストア(Persistent Store)が正しく初期化されていない状態で保存操作を試みた際に発生します。具体的には:
-
NSPersistentContainer
のインスタンスは作成されていますが -
loadPersistentStores
が呼び出されていないため - 永続ストアが実際にロードされていない状態です
解決方法
enum PlaylistRepositoryKey: DependencyKey {
static let liveValue: any PlaylistRepository = {
let container = NSPersistentContainer(name: "VoiLog")
container.loadPersistentStores { description, error in
if let error = error {
fatalError("CoreData store failed to load: \(error.localizedDescription)")
}
}
container.viewContext.automaticallyMergesChangesFromParent = true
return CoreDataPlaylistRepository(context: container.viewContext)
}()
}
解決のポイント
-
NSPersistentContainer
のインスタンスを保持 -
loadPersistentStores
を必ず呼び出し - エラーハンドリングを実装
- コンテキストの設定(必要に応じて)を行う
その他の注意点
-
loadPersistentStores
は非同期で動作するため、完了を待つ必要がある場合もあります - プロダクション環境では
fatalError
の代わりに適切なエラーハンドリングを実装すべきです - 可能であれば、アプリケーション起動時に一度だけCoreDataスタックを初期化することを推奨します
このエラーは正しい初期化手順を踏むことで簡単に回避できます。CoreDataを使用する際は、永続ストアの初期化を確実に行うことが重要です。
Discussion