Jan 192012
 

Objective-CでCoredataをiCloudで異なるデバイス間で同期する時のファイル構成を図解。entitlementsファイルで指定したキーと

URLForUbiquityContainerIdentifierおよびNSPersistentStoreCoordinatorの関係。NSPersistentStoreUbiquitousContentNameKeyやNSPersistentStoreUbiquitousContentURLKeyの関係についてのまとめ。

ここではiCloudで単一のCoredataを使う場合を考える。ここで仮想の条件で

  • app照合IDはcom.f60k.lab(以下appID)
  • individual IDはA0EEE752E ($(TeamIdentifierPrefix)はindividual IDで置き換えが可能。)
とした。
entitlementsファイルで指定した「A0EEE752E.com.f60k.lab」という文字列はURLForUbiquityContainerIdentifierで参照できる。この文字列はmobileprovisionファイル中にも記載されている。この名前をベースにしてコンテナ内にフォルダ(ここではA0EEE752E~com~f60k~lab)が作成される。
その中にフォルダ(ここではlabdb)が作成される。このフォルダはNSPersistentStoreUbiquitousContentURLKeyで指定した名称が使われる。このフォルダに永続ストア(ここではsqliteファイル)を同期するために必要な情報をやりとりした結果(Coredataの変更差分ログファイル)が格納されるのだが、デバイスごとに固有のフォルダが作成される。例えばiPhoneとiPadという2つの場合は図のように2つの「mobile.デバイスID」というフォルダがさらに作成され、その中にNSPersistentStoreUbiquitousContentNameKeyで指定した名称でフォルダが作られ、その中にログファイルが格納される。つまりデバイスが何台ありどのデバイスがどういう変更をどのタイミングで行ったかがわかる。このファイルを受信するとアプリケーションドキュメントフォルダのsqliteが更新される。
DBとなるsqliteはiCloudと同期しないアプリケーションドキュメントフォルダの位置に保存されているが、iCloud中にDBファイルを保存することもできるが.nosyncとサフィックスを追加しておく。nosyncしなければ同期DBファイルそのものを一括で同期することもできるが、サイズが小さい場合に限った方が賢明。

UIDocumentベースのケースについてはまた別の機会。

参考サイト

http://goddess-gate.com/dc2/index.php/post/452

コメント

個のコメント

Powered by Facebook Comments

 Posted by at 03:07

Sorry, the comment form is closed at this time.