我正在尝试在Core Data对象中归档/取消归档NSManagedObjectID,以便下次启动应用程序时,我可以检索这些ID并使用它们来获取特定对象。
我尝试“存档”这样的ID:
//defaultConfiguration is an NSManagedObject defined elsewhere and it works just fine...
// and newObject is also properly initialized, bound to a context,etc...
ArchivedID* newID = [NSEntityDescription insertNewObjectForEntityForName:@"ArchivedID" inManagedObjectContext:managedObjectContext];
[self.defaultConfiguration addArchiveIDObject:newID];
newID.idURI = [[newObject objectID] URIRepresentation];
[managedObjectContext save:&error];
然后像这样取消归档(我只是为了[anyObject],因为我正在测试,此时只有一个):
NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]];
但是当我尝试像上面那样获取URL时,我得到以下异常:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArchivedID relativeString]: unrecognized selector sent to instance 0x7f59f20'
实体中的属性是通过Xcode设置为“可转换”的,我将Xcode中的变换器值字段留空了,因为Core Data文档似乎暗示如果为空则使用默认变换器。
我做错了什么?
答案 0 :(得分:1)
您可以在不存储URL的情况下解决此问题。考虑在模型中添加一个布尔标志,并将要检索的对象标记为true,然后在下次启动应用程序时获取标记对象。
但是,您可以尝试使用-absoluteString
获取URL的字符串版本并存储。
答案 1 :(得分:0)
好的...这已经是14小时的编码了......我是......呃......白痴:
我忘了访问ArchivedID对象中的属性。那就是:
NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]];
应该是
NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[[defaultConfiguration.archiveID anyObject] idURI]];
答案 2 :(得分:0)
嗯。看起来有一种更简单的方法来使用CoreData。请记住,CoreData是一个对象图。它擅长跟踪人际关系。
为什么不让CoreData中的实体与您喜欢的对象保持一对多的关系?然后,您只需在对象集合中插入/删除/搜索/迭代/任何内容。
答案 3 :(得分:-1)
我喜欢@kevboh建议的内容。您还可以考虑在objectID
中存储特定NSManagedObject
的{{1}}个。 E.g:
NSUserDefaults