web-dev-qa-db-ja.com

コアデータ-データベース内の行のプライマリキーID

Core Dataに保存されている書籍のリストがあるとします。プライマリキーIDで書籍を検索したい。 Core Dataによって作成されたsqliteファイルには各テーブルにID列がありますが、これはとにかく公開されていないようです。

誰にも推奨事項はありますか?

ありがとう!

41
WoodenKitty

-[NSManagedObject objectID]は、Core Dataのオブジェクトインスタンスの一意のIDです。 -[NSManagedObjectID URIRepresentation]を介してシリアル化できます。 -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:]で永続ストアコーディネーターからobjectIDを取得し、-[NSManagedObjectContext objectWithID:]で管理対象オブジェクトコンテキストからオブジェクトを取得できます。

[〜#〜] but [〜#〜]

Core DataはORMではないであることに注意してください。 オブジェクトグラフ管理フレームワーク です。バックエンドは純粋に実装の詳細であるため、SQLite(および一意の行ID)を使用します。 SQL/RDBMSの考え方から早く脱却できるほど、Core Dataの満足度が上がります。保存されたIDからオブジェクトを見つけようとする代わりに、そのオブジェクトが必要な理由と必要なオブジェクトを検討してください。クラスFooのインスタンスがクラスBarのインスタンスに到達できる必要がある場合は、単にFooからBarへの関連付けを作成し、適切なBarインスタンスの関連付けのターゲットとして適切なFooインスタンスを設定しないでください。 Core DataにオブジェクトIDを追跡させます。

100
Barry Wark

バリー・ワーククが言ったように、コアデータはオームではないことを常に覚えておいてください。純粋なSQLの詳細はユーザーには公開されず、すべての行は単なるオブジェクトです。ちなみに、「プライマリキー」にアクセスする必要がある場合があります。たとえば、coredata dbを外部SQLデータベースと同期する必要がある場合(私の場合は、INSERT後にオブジェクトの状態を変更するためにコールバック関数で必要でした)リモートデータベースで成功した場合)。この場合、次を使用できます。

objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString]

x-coredata:// 76BA122F-0BF5-4D9D-AE3F-BD321271B004/Object/p521のような文字列を返します。これは、coredataがそのオブジェクトを識別するために使用する一意のIDです。

その一意のIDを持つオブジェクトを取得する場合:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]];

注:受信者がまだCoreDataコンテキストに保存されていない場合、オブジェクトIDはオブジェクトが保存されるときに変更される一時的な値であることに注意してください。

45
Donnit