📑

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)が正しく初期化されていない状態で保存操作を試みた際に発生します。具体的には:

  1. NSPersistentContainerのインスタンスは作成されていますが
  2. loadPersistentStoresが呼び出されていないため
  3. 永続ストアが実際にロードされていない状態です

解決方法

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)
    }()
}

解決のポイント

  1. NSPersistentContainerのインスタンスを保持
  2. loadPersistentStoresを必ず呼び出し
  3. エラーハンドリングを実装
  4. コンテキストの設定(必要に応じて)を行う

その他の注意点

  • loadPersistentStoresは非同期で動作するため、完了を待つ必要がある場合もあります
  • プロダクション環境ではfatalErrorの代わりに適切なエラーハンドリングを実装すべきです
  • 可能であれば、アプリケーション起動時に一度だけCoreDataスタックを初期化することを推奨します

このエラーは正しい初期化手順を踏むことで簡単に回避できます。CoreDataを使用する際は、永続ストアの初期化を確実に行うことが重要です。

Discussion