Cocoaメモ

Appleプラットフォームでの開発メモ

NSPersistentContainerのsqliteファイルパスをカスタマイズする

基本

let container = NSPersistentContainer(name: "Sample")

NSPersistentContainer.init(name:)

By default, the provided name value is used to name the persistent store and is used to look up the name of the NSManagedObjectModel object to be used with the NSPersistentContainer object.

name引数は、次の二つの用途で利用される。

  • sqliteファイル名
  • ManagedObjectModelファイル名

NSPersistentContainer(name: "Sample")の場合、

  • Sample.sqliteファイルが作成される
  • ManagedObjectModelファイルとして、Bundle内のSample.momd(または.mom)が利用される

sqliteファイルはNSPersistentContainer.defaultDirectoryURL()で示されるディレクトリ直下に作成される。

iOS 14.5では/Library/Application Supportとなっていた。

パスのカスタマイズ方法

方法(1) ディレクトリを変更する

NSPersistentContainer.defaultDirectoryURL()

This method can be overridden in a subclass of NSPersistentContainer.

例えば/Documentを指定したい場合、次のようにする。

class MyPersistentContainer: NSPersistentContainer {
    override class func defaultDirectoryURL() -> URL {
        FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    }
}

let container = MyPersistentContainer(name: "Sample")
// sqliteファイルのパスは、 "{アプリケーションホーム}/Documents/Sample.sqlite"

方法(2) sqliteファイルのフルパスを指定する

NSPersistentContainer.persistentStoreDescriptions.urlに、ファイルのフルパスを指定する。

この場合、NSPersistentContainer(name:)nameや、NSPersistentContainer.defaultDirectoryURLは無視される。

nameはManagedObjectModelファイルの検索だけに利用される。

let container = MyPersistentContainer(name: "Sample")

let documentsUrl = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
let sqliteUrl = documentsUrl.appendingPathComponent("cache.sqlite")
container.persistentStoreDescriptions[0].url = sqliteUrl

// sqliteファイルのパスは、 "{アプリケーションホーム}/Library/Caches/cache.sqlite"