Как получить идентификатор объекта, сохраненного в контексте управляемого объекта Core Data? - PullRequest
5 голосов
/ 15 июля 2010

У меня есть этот код:

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

, и я хочу знать идентификатор объекта, вставленного в контекст управляемого объекта.Как я могу получить это?

Будет ли этот идентификатор оставаться неизменным на протяжении жизни этого объекта или он будет сохраняться в базе данных sqlLite, расположенной ниже, и будет использоваться для уникальной идентификации его во время операции выборки (мой окончательный вариантцель).

Любая помощь приветствуется //:)

Ответы [ 3 ]

10 голосов
/ 15 июля 2010

Если вы хотите сохранить идентификатор объекта на постоянной основе, вам необходимо:

  1. Сохранить объект в контексте, чтобы идентификатор изменился с временного на постоянный идентификатор.
  2. Извлеките версию URI постоянного идентификатора с помощью -[NSManagedObjectID URIRepresentation].Это возвращает NSURL, который вы можете сохранить как преобразуемый атрибут в другом управляемом объекте.
  3. Вы можете получить объект, используя -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:], чтобы сгенерировать новый NSManagedObjectID объект, а затем использовать -[NSManagedObjectContext objectWithID:], чтобы получить фактическую ссылкууправляемый объект.

Предполагается, что URI идентифицирует конкретный объект в определенном хранилище на определенном компьютере, но он может измениться, если вы внесете какие-либо структурные изменения в хранилище, например перенесете его в новую версию модели.

Однако вам, вероятно, не нужно ничего этого делать.ObjectID играют гораздо меньшую роль в базовых данных, чем в других системах моделей данных.Базовые данные поддерживают граф объектов, который однозначно идентифицирует объекты по их расположению на графике.Простая прогулка по графику отношений приведет вас к определенному уникальному объекту.

Единственный раз, когда вам действительно нужен ObjectID, это когда вы обращаетесь к объекту через два или более постоянных хранилища.Тогда они вам нужны, потому что отношения не пересекают магазины.

2 голосов
/ 15 июля 2010

Прочтите "идентификаторы управляемых объектов" в Руководство по программированию основных данных

Вы можете получить идентификатор объекта из объекта с помощью чего-то вроде:

NSManagedObjectID *moID = [managedObject objectID];
0 голосов
/ 15 июля 2010

Во-первых, вы строите свои объекты не в предпочтительном порядке.Обычно вам следует:

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

Во-вторых, когда вы создаете объект, он получает временный идентификатор, к которому вы можете получить доступ через [user objectID], как упоминал Дэвид.Как только вы сохраните контекст, он получит новый «постоянный» идентификатор.

Однако этот идентификатор может изменяться и изменяется в течение жизни объекта (хотя и не экземпляра).Такие вещи, как перенос данных, могут привести к изменению этого идентификатора.Однако между сохранением контекста и выходом из приложения идентификатор останется прежним.

...