我找到了这个很棒的NSManagedObjectID。这对于引用Entity / NSManagedObject / NSEntityDescription非常有用,对吧? 让我们从实体获取一个ID:
NSEntityDescription *entity = [self newEntity];
NSManagedObjectID *objID = [entity objectID];
那么......任何想法如何将这个objID
变成字符串?或者更好:NSData。实际上可以将它保存到NSUserDefaults。 ;-)
顺便说一下:NSFetchRequest不想在我的情况下工作。我使用此示例的修改版本:answer of an old question。
答案 0 :(得分:38)
获取与NSManagedObject
的{{1}}:
objectID
为了返回原始托管对象的实例,您需要一个CoreData堆栈,其持久存储将已添加已添加到NSManagedObject* myMO;
...
NSURL *uri = [[myMO objectID] URIRepresentation];
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri];
。然后:
NSPersistentStoreCoordinator
答案 1 :(得分:5)
来自NSManagedObjectID documentation:
对象ID可以转换为 URI表示可以是 存档并稍后重新创建 回到给定的对象(使用 managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator)和 objectWithID: (的NSManagedObjectContext)。例如, 最后选择的一个组 应用程序可以存储在 用户默认通过该组 对象的ID。您也可以使用对象 用于存储“弱”的ID URI表示 跨持久性商店的关系 (没有硬连接的地方)。
只需将其转换为网址,然后将其转换为字符串或数据。
答案 2 :(得分:3)
你看过URIRepresentation了吗?将NSURL转换为NSString并将其转换为NSData很容易。
答案 3 :(得分:3)
在归档之前,您无需将NSURL转换为NSString。只需归档NSURL。
编辑:我最近了解到对象的ID可能会发生变化,例如迁移后。因此,将ID保存到磁盘并期望以后能够引用该对象似乎不是一个好主意。
答案 4 :(得分:3)
这是我目前发现的最干净,最短的方法,使用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];
}
答案 5 :(得分:0)
正如@preston所说,不要将objectID保存到磁盘,而是:
更清洁,更好!