NSManagedObjectIDは保存前と後で違う値になる

CoreDataで保存したレコードを一意に識別する方法を検討中です。

CoreDataではprimaryKeyにあたるIDを内部でZ_PKで保持しているみたいです。
エンティティや属性は全てZ_というprefixがついてますが、Z_PKというのが恐らくprimaryKeyだと思います。
(参考:MacアプリNaviCatで.sqliteファイルの中身を確認する)


PKっぽいのがあるのは分かったんですが、それをコードから参照する方法わからない、
なのでNSManagedObjectから取得できるObjectIDを代わりに使おうと思って試したコードをメモします。


[注意点]
ObjectIDはNSManagedObjectから[mo objectID]のように取得できますが、
保存前と保存後でIDの値が違うので注意が必要です。

    //ManagedObjectContext(作業台)に「traning」を登録して、そのtraningオブジェクトを取得
    Traning *a_traning = [NSEntityDescription insertNewObjectForEntityForName:@"Traning"
                                                 inManagedObjectContext:moc];
    //作業台にのっている「todo」にデータをセットする
    a_traning.name        = @"ももあげ";
    a_traning.breaktime   = [NSNumber numberWithInt:8];
    a_traning.worktime    = [NSNumber numberWithInt:8];
    a_traning.repeat      = [NSNumber numberWithInt:7]; 

    //保存前のobjectIDを取得してみる。
    NSString *beforeSaveId = [[[a_traning objectID] URIRepresentation] description];
    NSLog(@"保存前のobjectID = %@",beforeSaveId);

    //保存
    [COREDATAMANAGER saveContext];    
    
    //保存後のobjectIDを取得してみる。
    NSString *afterSaveId = [[[a_traning objectID] URIRepresentation] description];    
    NSLog(@"保存後のobjectID = %@",afterSaveId);

実行結果

2012-06-23 23:31:29.920 Yarukoto[657:fb03]
保存前のobjectID = x-coredata:///Traning/tB28E6644-72B0-4EB0-8BFB-E0EE9E90CAFC2

2012-06-23 23:31:29.929 Yarukoto[657:fb03]
保存後のobjectID = x-coredata://2C0D77BB-3E3D-4907-A328-C4A5108F538E/Traning/p4



isTemporaryIDというメソッドで「一時的なIDかどうか」を確認できるようです。

(参考:NSManagedObjectID クラスリファレンス)