CoreDataを扱うライブラリであるMagicalRecordをよく使いますが、
MagicalRecord では保存するデータベースファイル(デフォルトはアプリ名.sqlite)の名前指定するメソッドしか用意されていません。

具体的には、Setting up the Core Data Stackにかかれているようにsetup*経由で初期化処理をする際に、ファイル名を指定することが出来ます。


+ (void) setupCoreDataStackWithStoreNamed:(NSString *)storeName;

等ですね。

この時、デフォルトでは

Library/Application\ Support/アプリ名/アプリ名.sqlite

にsqliteファイルが保存されます。

アプリのディレクトリ
├── Documents
├── Library
│   ├── Application\ Support
│   │   └── アプリ名
│   ├── Caches
│   └── Preferences
├── アプリ名.app
└── tmp

しかし、すでに Documents/アプリ名.sqlite というようにDocumentsディレクトリ以下にsqliteファイルが有った場合はそちらが使われます。

MagicalRecord内部ではどのようになっているのかを見てみます。

setupメソッドで渡したstoreNameは、+ (NSURL *) MR_urlForStoreName:(NSString *)storeFileNameを使いNSURLとして取得されています。
+ (NSURL *) MR_urlForStoreName:(NSString *)storeFileName では、NSDocumentDirectoryとNSApplicationSupportDirectory(Application\ Support)の両方をみています。

どちらかに該当するsqliteファイルがあったらそれを利用するようになっているため、
Document/ にsqliteがあったらそちらが使われますし、 Application\ Support/にsqliteがあった場合はこちらが使われます。

+ (NSURL *) MR_urlForStoreName:(NSString *)storeFileName はPublicメソッドなので、MagicalRecordを使っていて保存されているsqliteファイルのパスを取得したい場合は、
直接、NSApplicationSupportDirectoryなどを見ないで、+ (NSURL *) MR_urlForStoreName:(NSString *)storeFileNameを経由するのが無難でしょう。

最初に述べたように、setupメソッドには任意のNSURLを指定するメソッドは用意されていません。
(現時点では、[MagicalRecord setupCoreDataStackWithStore:storeURL]; のようにNSURLを渡すと、内部ではNSURLかを判定してる ため意図通りに動きますが、将来性は保証されてません)

そのためLibrary/Application\ Support/アプリ名/アプリ名.sqlite か Documents/アプリ名.sqlite 以外にsqliteファイルをおいている場合は、
その場所にファイルをコピーするなどの処理が必要になるでしょう。

その他

MagicalRecordの中の人がCore Data Recipes by Saul Mora [Leanpub PDF/iPad/Kindle]という書籍を書くことを検討しているみたいです。
興味がある人は書籍が完成したかどうかの通知に登録しておくといいです。 

Post Navigation