ページ

2010年6月1日火曜日

CoreData - Object ID(その1)NSManagedObjectID

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

NSManagedObject の Object ID
NSManagedObjectには、オブジェクトを一意に識別する為にObject ID割り振られている。この ID は NSManagedObjectID型として定義されていて、-[NSManagedObject objectID] で取得できる。

NSManagedObject Class Reference - objectID


NSManagedObjectID
このNSManagedObjectIDは次のメソッドを持っている。

- (NSEntityDescription *)entity
- (BOOL)isTemporaryID
- (NSPersistentStore *)persistentStore
- (NSURL *)URIRepresentation

NSManagedObjectID Class Reference

saveするまでの間、Object ID は一時扱いとなる。その場合、-[isTemporaryID] が YES を返す。

-[URIRepresentation]は Object ID のURI表記を返す。

URIRepresentation の例
x-coredata://1C336A08-41AD-48E9-8A3F-8AFF17244055/Book/p1

(以下推測)
x-coredata | プロトコル
1C336A08-41.. | モデルの UUID(もしくは類似のID)
book | エンティティ名
p1 | 'p' + プライマリキー

なおsave前の(一時的な)Object ID の URIRepresentation は次のようになる。
x-coredata:///Book/t7839D4D0-A144-4C95-B14C-33AEFAF337632

リファレンスによれば、Object ID は他のアプリケーションも含めユニークなものになるとのこと。終了時に plistへ保存しておいて、次回起動時にこのIDから前回使っていた情報を取得するなんて用途に使える。


サンプル
Object ID を見るための簡単なサンプルを用意した。

ソース:CoreDataObjectID at 2010-06-01 from xcatsan's SampleCode - GitHub

モデルの定義はこんな感じ。

実行するとテーブルが現れる。Addで追加ができる。この時点ではまだテンポラリなIDが割り振られている。

saveすると正式なものが割り振られる。
この時の SQLiteの中身。
$ sqlite3 storedata 
SQLite version 3.6.12
Enter ".help" for instructions
sqlite> .schema zbook
CREATE TABLE ZBOOK ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZTITLE VARCHAR, ZAUTHOR VARCHAR );
sqlite> select * from zbook;
1|1|1|Book1|Neko
sqlite>
sqlite> .schema z_metadata
CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB);
sqlite> select * from z_metadata;
1|677CA547-4D80-417A-8810-70847FB0375D|bplist00?
_NSStoreModelVersionIdentifiers_NSPersistenceFrameworkVersion_NSStoreModelVersionHashes[NSStoreType_ NSStoreModelVersionHashesVersion__NSAutoVacuumLevel???

ObjectID に含まれるUUIDが Z_METADATAに格納されているのがわかる。