Cocoa NSManagedObjected到NSData
我发现了这个很棒的目标。这对于引用实体/NSManagedObject/NSEntityDescription非常有用,对吗?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
让我们从实体中获取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保存到磁盘,而是:
更干净、更好!这是我目前找到的最干净、最短的方法,使用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];
}