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-E0EE9E90CAFC22012-06-23 23:31:29.929 Yarukoto[657:fb03]
保存後のobjectID = x-coredata://2C0D77BB-3E3D-4907-A328-C4A5108F538E/Traning/p4
isTemporaryIDというメソッドで「一時的なIDかどうか」を確認できるようです。