Cocoa NSManagedObjected到NSData

Cocoa NSManagedObjected到NSData,cocoa,core-data,save,Cocoa,Core Data,Save,我发现了这个很棒的目标。这对于引用实体/NSManagedObject/NSEntityDescription非常有用,对吗? 让我们从实体中获取ID: NSEntityDescription *entity = [self newEntity]; NSManagedObjectID *objID = [entity objectID]; 所以。。。知道如何将这个objID转换成字符串吗?或者更好:NSData。实际上有些东西可以保存到NSUserDefaults 顺便说一句:NSF

我发现了这个很棒的目标。这对于引用实体/NSManagedObject/NSEntityDescription非常有用,对吗?
让我们从实体中获取ID:

NSEntityDescription *entity = [self newEntity];     
NSManagedObjectID *objID = [entity objectID];
所以。。。知道如何将这个
objID
转换成字符串吗?或者更好:NSData。实际上有些东西可以保存到NSUserDefaults


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

你看了吗?很容易将NSURL转换为NSString,并将其转换为NSData。

从NSManagedObjectID:

对象ID可以转换为 URI表示,可以是 存档并稍后重新创建以供参考 返回到给定对象(使用 ManagedObjectdForUri表示: (NSP协调员)和 objectWithID: (NSManagedObjectContext)。例如, 中最后选定的组 应用程序可以存储在 用户通过组设置默认值 对象的ID。您也可以使用对象 要存储“弱”的ID URI表示 跨持久存储的关系 (在不可能硬连接的情况下)


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

要获取与
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];

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


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

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

  • 在实体上创建一个名为“id”的新属性
  • 在实体的父实体上创建一个名为“myEntitysMaxId”的新属性
  • 重写实体的父实现“addNewMyEntityObject:”
  • 在这里,增加“myEntitysMaxId”并将该值设置为新的entitys“id”
  • 当您根据实体的属性获取实体时,请按正常操作

  • 更干净、更好!

    这是我目前找到的最干净、最短的方法,使用4.0中添加的
    setURL
    getURL
    方法,以避免对
    NSKeyedUnarchiver
    nskeyedurchiver
    的额外调用:

    设置器:

     + (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];
     }
    
    Getter:

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