普通にDBを使っていて、プライマリキーとかユニークキーとか当たり前に使うものだと思っていたけど、CoreDataを利用するにあたってはその概念が当てはまらない。とはいえ、SQLiteをラップしているので、裏側ではちゃんとプライマリキーとか持っているようだが、表だって使うことができないのだ。
でもいろいろなviewを行き来するのに、そのテーブル(エンティティ)内の一意のデータのキーを持ちまわるのが妥当と判断したため、どうしても PRIMARY KEY に AUTO INCREMENT を設定したカラムを使いたかったのだが、いろいろ調べた結果、直接、PRIMARY KEY も AUTO INCREMENT も使うことができないことが判った。(実は良い方法があるのかもしれないが、そこまでCoreDataを熟知していない。SQLiteを直接実行する方法もあるのかな?)
で、もっと調べて、代わりに利用できそうなのが NSManagedObjectID である。これは、TableView(っていうかfetchedResultsController) で利用される indexPath と似ているので理解が早い。
使い方は簡単。
まず最初に、取得した ManagedObject から objectID を保持。
NSManagedObjectID *objID = [managedObject objectID];
NSLog(@"entryID == %d", objID );
保持した objectID を使って、managedObjectContext から目的の ManagedObject を取り出す。
NSManagedObject *managedObject
= [managedObjectContext objectWithID:objID];
とりあえず、これで目的の挙動の代用とすることができる。
ただ、この objectID の注意点としては、 AUTO INCREMENT のように1からの連番ではないということ。
また、コンパイル毎に違う数字が返される。ってことは、DB上で持っている数字ではなく、システムで与えられる数字なのだろう。この点は TableView で利用される indexPath も同じことが言える。
まだまだ勉強中のため、間違いがあればご指摘ください。
NSManagedObjectID経由でPRIMARY KEYなら取れます。スキーマを見る限り、AUTO INCREMENTではないですけど。 http://xcatsan.blogspot.com/2010/06/coredata-object-idnsmanagedobjectid.html
通りすがり様
コメント、ありがとうございます。
裏でSQLiteが動いているのでPRIMARY KEYはありますね。
単純なINSERT処理でしか調べてはいませんが、追加するだけなら AUTO INCREMENT になっていそうです。
ただ、残念なことに、このキーを利用してデータを取得する方法がないのかなぁと。
その代わりにNSManagedObjectIDを使えってことだと思います。
まだまだ勉強中ですので、どんどんご指摘、ご教示頂けると助かります!!
ありがとうございます。