NSManagedObjectID в NSData
Я нашел этот замечательный NSManagedObjectID. Это было бы очень полезно для ссылки на Entity/NSManagedObject/NSEntityDescription, правильно?
Позвольте получить идентификатор от объекта:
NSEntityDescription *entity = [self newEntity];
NSManagedObjectID *objID = [entity objectID];
Итак... любая идея, как получить этот objID
в строку? Или лучше: NSData. На самом деле что-то, что можно сохранить в NSUserDefaults.;-)
Btw: NSFetchRequest не хочет работать в моем случае. Я использую модифицированную версию этого примера: ответ старого вопроса.
Ответы
Ответ 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"
- Выполняйте, как обычно, при получении объекта на основе его атрибутов!
Гораздо чище и лучше!