NSManagedObjectID 到 NSData
题
我发现了这个美妙的 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];
为了找回原来的管理对象的实例,您需要与持久化存储持有该实例的已添加应用于NSPersistentStoreCoordinator
一个CoreData堆栈。然后:
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)和 objectWithID: (的NSManagedObjectContext)。例如, 在最后选择的组 应用程序可以被存储在 通过该组用户默认 对象的ID。您还可以使用对象 ID URI表示存储“弱” 跨持久性存储的关系 (其中没有硬连接是可能的)。
只需把它变成一个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 保存到磁盘,而是:
- 在您的实体上创建一个名为“id”的新属性
- 在您的实体父实体上创建一个名为“myEntitysMaxId”的新属性
- 覆盖您的实体父实现“addNewMyEntityObject:”
- 在那里,增加“myEntitysMaxId”并将该值设置为新实体“id”
- 就像您通常根据属性获取实体时所做的那样!
更干净、更好!