我发现了这个美妙的 NSManagedObjectID。这对于引用 Entity/NSManagedObject/NSEntityDescription 非常有用,对吧?
让我们从实体获取 ID:
NSEntityDescription *entity = [self newEntity];
NSManagedObjectID *objID = [entity objectID];
那么...知道如何将这个
objID
放入字符串中吗?或者更好:NSData。实际上可以将其保存到 NSUserDefaults 中。 ;-)
顺便说一句:NSFetchRequest 不想在我的情况下工作。我使用此示例的修改版本:旧问题的答案。
要获取与
NSManagedObject
的 objectID
对应的存档 URI:
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];
来自 NSManagedObjectID 文档:
对象 ID 可以转换为 URI 表示可以是 存档并稍后重新创建以供参考 回到给定的对象(使用
和managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator)
。例如, 最后选择的组 应用程序可以存储在 用户默认通过组 对象的 ID。您还可以使用对象 用于存储“弱”的 ID URI 表示 跨持久存储的关系 (不可能进行硬连接)。objectWithID: (NSManagedObjectContext)
只需将其转换为 URL,然后将其转换为字符串或数据即可。
您看过URIRepresentation吗?将 NSURL 转换为 NSString,然后转换为 NSData 很容易。
在归档之前,您不需要将 NSURL 转换为 NSString。 只需存档 NSURL。
编辑:我最近了解到对象的 ID 可以更改,例如在迁移之后。因此,将 ID 保存到磁盘以期稍后能够引用该对象似乎不是一个好主意。
这是我目前发现的最干净、最短的方法,使用 4.0 中添加的
setURL
和 getURL
方法以避免额外调用 NSKeyedUnarchiver
和 NSKeyedArchiver
:
二传手:
+ (void)storeSomeObjectId:(NSManagedObjectID *)objectId
{
[[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation]
forKey:@"someObjectIdKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
吸气剂:
+ (SomeManagedObject *)getObjectByStoredId
{
NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"];
NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId];
}
正如@preston所说,不要将objectID保存到磁盘,而是:
更干净、更好!