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

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

所以...知道如何得到这个 objID 成字符串?或更好:NSData。实际上可以将其保存到 NSUserDefaults 中。;-)

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

有帮助吗?

解决方案

要获得对应于NSManagedObjectobjectID存档的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 保存到磁盘,而是:

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

更干净、更好!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top