NSManagedObjectID 到 NSData

问题描述 投票:0回答:6

我发现了这个美妙的 NSManagedObjectID。这对于引用 Entity/NSManagedObject/NSEntityDescription 非常有用,对吧?
让我们从实体获取 ID:

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

那么...知道如何将这个

objID
放入字符串中吗?或者更好:NSData。实际上可以将其保存到 NSUserDefaults 中。 ;-)

顺便说一句:NSFetchRequest 不想在我的情况下工作。我使用此示例的修改版本:旧问题的答案

cocoa core-data save
6个回答
39
投票

要获取与

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];

5
投票

来自 NSManagedObjectID 文档

对象 ID 可以转换为 URI 表示可以是 存档并稍后重新创建以供参考 回到给定的对象(使用

managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator)
objectWithID: (NSManagedObjectContext)
。例如, 最后选择的组 应用程序可以存储在 用户默认通过组 对象的 ID。您还可以使用对象 用于存储“弱”的 ID URI 表示 跨持久存储的关系 (不可能进行硬连接)。

只需将其转换为 URL,然后将其转换为字符串或数据即可。


3
投票

您看过URIRepresentation吗?将 NSURL 转换为 NSString,然后转换为 NSData 很容易。


3
投票

在归档之前,您不需要将 NSURL 转换为 NSString。 只需存档 NSURL。

编辑:我最近了解到对象的 ID 可以更改,例如在迁移之后。因此,将 ID 保存到磁盘以期稍后能够引用该对象似乎不是一个好主意。


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];
 }

0
投票

正如@preston所说,不要将objectID保存到磁盘,而是:

  1. 在您的实体上创建一个名为“id”的新属性
  2. 在实体父实体上创建一个名为“myEntitysMaxId”的新属性
  3. 覆盖您的实体父实现“addNewMyEntityObject:”
  4. 在那里,增加“myEntitysMaxId”并将该值设置为新实体“id”
  5. 像平常一样根据属性获取实体!

更干净、更好!

© www.soinside.com 2019 - 2024. All rights reserved.