14

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

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

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

顺便说一句: NSFetchRequest 不想在我的情况下工作。我使用了这个例子的修改版本:answer of an old question

4

6 回答 6

39

要获取对应于 a 的存档NSManagedObjectURI objectID

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];
于 2009-02-05T16:45:29.063 回答
5

从 NSManagedObjectID文档

对象 ID 可以转换为 URI 表示形式,以后可以归档和重新创建以引用给定对象(使用 managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator) 和 objectWithID: (NSManagedObjectContext)。例如,可以存储应用程序中最后选择的组在用户中默认通过组对象的 ID。您还可以使用对象 ID URI 表示来存储跨持久存储的“弱”关系(不可能进行硬连接)。

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

于 2009-02-05T16:37:06.633 回答
3

你看过URIRepresentation吗?将 NSURL 转换为 NSString 和 NSData 很容易。

于 2009-02-05T16:28:56.710 回答
3

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

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

于 2009-10-06T23:45:10.263 回答
3

这是我目前发现的最干净和最短的方法,使用 4.0 中添加的setURLandgetURL方法来避免对NSKeyedUnarchiverand的额外调用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];
 }
于 2013-12-28T20:42:10.047 回答
0

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

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

更干净更好!

于 2013-04-05T19:08:03.910 回答