iPhone SDK CoreDataで AUTO INCREMENT の代わりにNSManagedObjectIDを使う

| コメント(2) | トラックバック(0)
普通に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 も同じことが言える。

 

まだまだ勉強中のため、間違いがあればご指摘ください。

トラックバック(0)

トラックバックURL: http://www.siesta-design.com/mtadmin/mt-tb.cgi/18

コメント(2)

NSManagedObjectID経由でPRIMARY KEYなら取れます。スキーマを見る限り、AUTO INCREMENTではないですけど。 http://xcatsan.blogspot.com/2010/06/coredata-object-idnsmanagedobjectid.html

通りすがり様
コメント、ありがとうございます。
裏でSQLiteが動いているのでPRIMARY KEYはありますね。
単純なINSERT処理でしか調べてはいませんが、追加するだけなら AUTO INCREMENT になっていそうです。

ただ、残念なことに、このキーを利用してデータを取得する方法がないのかなぁと。
その代わりにNSManagedObjectIDを使えってことだと思います。

まだまだ勉強中ですので、どんどんご指摘、ご教示頂けると助かります!!

ありがとうございます。

コメントする

2011年2月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28