将NSURL存储在Core Data中的正确方法是什么?

时间:2012-04-19 14:55:45

标签: ios cocoa core-data foundation nsvaluetransformer

我正在尝试在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文档似乎暗示如果为空则使用默认变换器。

我做错了什么?

4 个答案:

答案 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