5

私はこのコードを持っています:

NSEntityDescription *userEntity = [[[engine managedObjectModel] entitiesByName] objectForKey:@"User"];
User *user = [[User alloc] initWithEntity:userEntity insertIntoManagedObjectContext:[engine managedObjectContext]];

管理オブジェクトコンテキストに挿入されたオブジェクトのIDを知りたいです。どうすればそれを取得できますか?

そのIDはそのオブジェクトの存続期間中同じままですか、それともこの下のsqlLiteデータベースに永続化され、フェッチ操作中に一意に識別するために使用できるものになります(私の最終的な目標)。

助けていただければ幸いです// :)

4

3 に答える 3

10

オブジェクトの ID を永続的に保存する場合は、次のことを行う必要があります。

  1. ID が一時 ID から永続 ID に変わるように、オブジェクトをコンテキストに保存します。
  2. を使用して、永続 ID の URI バージョンを抽出し-[NSManagedObjectID URIRepresentation]ます。これにより、変換可能な属性として別の管理対象オブジェクトに格納できる NSURL が返されます。
  3. を使用-[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:]して新しいNSManagedObjectIDオブジェクトを生成し、 を使用-[NSManagedObjectContext objectWithID:]して実際に参照されている管理対象オブジェクトを取得することで、オブジェクトを取得できます。

URI は、特定のコンピューター上の特定のストア内の特定のオブジェクトを識別することになっていますが、ストアを新しいモデル バージョンに移行するなど、ストアに構造的な変更を加えると、URI が変更される可能性があります。

ただし、おそらくこれを行う必要はありません。ObjectID がコア データで果たす役割は、他のデータ モデル システムよりもはるかに小さいです。Core Data は、グラフ内の位置によってオブジェクトを一意に識別するオブジェクト グラフを維持します。グラフの関係をたどるだけで、特定の固有のオブジェクトにたどり着きます。

ObjectID が本当に必要になるのは、2 つ以上の永続ストアにまたがってオブジェクトにアクセスするときだけです。リレーションシップはストアをまたがらないため、それらが必要になります。

于 2010-07-15T13:20:33.080 に答える
2

Core Data Programming Guideの「管理対象オブジェクト ID」を参照してください。

次のような方法で、オブジェクトからオブジェクト ID を取得できます。

NSManagedObjectID *moID = [managedObject objectID];
于 2010-07-15T00:51:14.867 に答える
0

まず、好ましくない方法でオブジェクトを構築しています。通常、次のことを行う必要があります。

User *user = [NSEntityDescription insertEntityForName:@"User" intoManagedObjectContext:[engine managedObjectContext]];

次に、オブジェクトを作成すると、David が述べたように [user objectID] 経由でアクセスできる一時 ID が取得されます。コンテキストを保存すると、新しい「永続的な」ID が取得されます。

ただし、この ID はエンティティの存続期間にわたって変更される可能性があり、実際に変更されます (インスタンスではありません)。データの移行などにより、この ID が変更される可能性があります。ただし、コンテキストを保存してからアプリケーションを終了するまでの間、ID は同じままです。

于 2010-07-15T03:43:11.333 に答える