2011-01-18 10 views
36

コアデータに格納されている書籍のリストがあるとします。主キーIDで本を検索したい私は、コアデータによって作成されたsqliteファイルが各テーブルにID列を持っていることを知っていますが、これはとにかく私には公開されていないようです。コアデータ - データベース内の行の主キーID

おすすめの人はいますか?

ありがとうございます!

答えて

94

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

しかし

あなたはコアデータがない ORMであるということを覚えておいてください。それはobject graph management frameworkです。これは、バックエンドは純粋に実装の詳細なので、SQLite(および一意の行ID)を使用しています。 SQL/RDBMSの考え方から早く離れるほど、コアデータに素早く慣れます。格納されたIDからオブジェクトを探すのではなく、そのオブジェクトが必要な理由とそのオブジェクトが必要とするものを考慮してください。 FooのインスタンスがクラスBarのインスタンスに到達できる必要がある場合は、FooからBarへの関連付けを作成し、適切なFooインスタンスで適切なBarインスタンスを関連付けのターゲットとして設定してください。コアデータにオブジェクトIDを記録させる。

+33

「コアデータはデータベースではありません。 – Abizern

+5

オブジェクトをIDで取得する必要がある一般的な使用例があります。テーブルビューのセル選択から詳細ビューコントローラへデータを渡すことができます。オブジェクト自体を渡すこともできますが、ディテールVCで異なるコンテキストを使用している場合は、したくないことがよくあります。 – memmons

+1

@Michael:まさに。これを行うベストプラクティスは何ですか? – Noah

42

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

のような文字列が返されます
objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString] 

:X-coredata:にcoredataによって使用される固有のIDです// 76BA122F-0BF5-4D9D-AE3F-BD321271B004 /オブジェクト/ P521をそのオブジェクトを識別する。

あなたはそれが一意のIDをバックオブジェクトを取得したい場合:

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

NB:受信機はまだCoreDataコンテキストに保存されていない場合は、オブジェクトIDがその意志一時的な値であることを忘れないでくださいオブジェクトが保存されると変更されます。

+1

正確に!同じ問題。エンティティの詳細を持つこのIDをリモートmySQLに入力し、それに応答してサーバに同じobjectIDを持つ一意のIDを生成させる必要があります。 オブジェクト・フォームobjectIdを取得し、サーバーIDをその中に格納します。 –

+0

nycの説明とコードをありがとうございました。私の問題を解決しました。:) –

+0

@donnit、amoghしたがって、オフサイトでコンテンツを保存している状況で私は何をしますか? IDと更新値を一致させることができますか? IDがデータベースに存在しない場合は、新しいオブジェクトを追加することもできます。どうすればそれを達成できますか? – Pavan

関連する問題