Подтвердить что ты не робот

NSManagedObjectID в NSData

Я нашел этот замечательный NSManagedObjectID. Это было бы очень полезно для ссылки на Entity/NSManagedObject/NSEntityDescription, правильно?
Позвольте получить идентификатор от объекта:

NSEntityDescription *entity = [self newEntity];     
NSManagedObjectID *objID = [entity objectID];

Итак... любая идея, как получить этот objID в строку? Или лучше: NSData. На самом деле что-то, что можно сохранить в NSUserDefaults.;-)

Btw: NSFetchRequest не хочет работать в моем случае. Я использую модифицированную версию этого примера: ответ старого вопроса.

4b9b3361

Ответ 1

Чтобы получить архивный URI, соответствующий NSManagedObject objectID:

NSManagedObject* myMO;
...
NSURL *uri = [[myMO objectID] URIRepresentation];
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri];

Чтобы вернуться к экземпляру исходного управляемого объекта, вам понадобится стек CoreData с постоянным хранилищем, в котором этот экземпляр уже добавлен в NSPersistentStoreCoordinator. Тогда:

NSData *uriData;
NSPersistentStoreCoordinator *psc;
NSManagedObjectContext *moc; //with moc.persistentStoreCoordinator = psc.
...
NSURL *uri = [NSKeyedUnarchiver unarchiveObjectWithData:uriData];
NSManagedObjectID *moID = [psc managedObjectIDForURIRepresentation:uri];
NSManagedObject *myMO = [moc objectWithID:moID];

Ответ 2

Из NSManagedObjectID documentation:

Идентификаторы объектов могут быть преобразованы в URI, которое может быть архивировано и воссоздано позже для ссылки назад к данному объекту (используя managedObjectIDForURIRepresentation: (NSPsistentStoreCoordinator) и objectWithID: (NSManagedObjectContext). Например, последняя выбранная группа в приложение может быть сохранено в по умолчанию пользователя через группу ID объектов. Вы также можете использовать объект ID URI для хранения "слабых" отношения между постоянными магазинами (там, где невозможно жесткое соединение).

Просто превратите его в URL-адрес, затем превратите его в строку или данные.

Ответ 3

Вы посмотрели URIRepresentation? Легко преобразовать NSURL в NSString, а также в NSData.

Ответ 4

Вам не нужно преобразовывать NSURL в NSString перед архивированием. Просто скопируйте NSURL.

Изменить: Недавно я узнал, что идентификатор объекта может измениться, например, после переноса. Поэтому представляется нецелесообразным сохранять идентификатор на диск, ожидая, что он сможет ссылаться на объект позже.

Ответ 5

Здесь самый чистый и самый короткий путь, который я нашел для этого в настоящее время, используя методы setURL и getURL, добавленные в 4.0, чтобы избежать дополнительных вызовов NSKeyedUnarchiver и NSKeyedArchiver:

сеттер:

 + (void)storeSomeObjectId:(NSManagedObjectID *)objectId
 {
     [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] 
                                            forKey:@"someObjectIdKey"];
     [[NSUserDefaults standardUserDefaults] synchronize];
 }

Getter:

 + (SomeManagedObject *)getObjectByStoredId
 {
     NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"];
     NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
     SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId];
 }

Ответ 6

Как сказал @preston, не сохраняйте идентификатор объекта на диске, вместо этого:

  • Создайте новый атрибут в вашей организации с именем "id"
  • Создайте новый атрибут родительского объекта вашей сущности под названием "myEntitysMaxId"
  • Переопределить родительскую реализацию сущностей "addNewMyEntityObject:"
  • Там увеличьте "myEntitysMaxId" и установите это значение в качестве новых объектов "id"
  • Выполняйте, как обычно, при получении объекта на основе его атрибутов!

Гораздо чище и лучше!