Ios 什么';在核心数据中存储NSURL的正确方法是什么?

Ios 什么';在核心数据中存储NSURL的正确方法是什么?,ios,cocoa,core-data,foundation,nsvaluetransformer,Ios,Cocoa,Core Data,Foundation,Nsvaluetransformer,我正在尝试在核心数据对象中归档/取消归档NSManagedObjects,以便下次启动应用程序时,我可以检索这些ID并使用它们获取特定对象 我试着像这样“归档”ID: //defaultConfiguration is an NSManagedObject defined elsewhere and it works just fine... // and newObject is also properly initialized, bound to a context,etc...

我正在尝试在核心数据对象中归档/取消归档NSManagedObjects,以便下次启动应用程序时,我可以检索这些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],因为我正在测试,现在只有一个):

但是,当我尝试像上面那样重新获取URL时,会出现以下异常:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArchivedID relativeString]: unrecognized selector sent to instance 0x7f59f20'
实体中的属性是通过Xcode设置为“transformable”,我将Xcode中的transformer value字段留空,因为核心数据文档似乎暗示如果为空,则使用默认的transformer


我做错了什么?

您可以在不存储URL的情况下解决此问题。考虑将布尔标记添加到模型中,并将希望检索的对象标记为true,然后在应用程序启动时获取标记对象。
但是,您可以尝试使用
-absoluteString
获取URL的字符串版本并将其存储。

好的。。。已经连续14个小时编码了。。我是。。呃。。白痴:

我忘记访问ArchiveId对象中的属性。即:

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]];
应该是

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[[defaultConfiguration.archiveID anyObject] idURI]];

我喜欢@kevboh的建议。您也可以考虑在代码< NSUDER DEFRESU/<代码>中存储特定的<代码> NSCONDEDATION < /代码> s的<代码>对象> <代码>。例如:

[[NSUserDefaults standardUserDefaults] setObject:featuredNSManagedObjectIDArray
                                          forKey:@"FeaturedNSManagedObjectIDs"];

嗯,似乎有一种更简单的方法来处理CoreData。记住,CoreData是一个对象图。它擅长跟踪人际关系


为什么不在CoreData中创建一个实体,与您喜欢的对象保持一对多的关系?然后,您可以在对象集合上插入/删除/搜索/迭代/任何操作。

如果采用这种方法,请确保选中布尔属性上的“索引”框,因为您将基于该标志进行获取。kevboh的方法可以工作,但会增加额外的间接级别。我很好,只是我有一个输入错误。归档的URL方法允许通过JSON等传输ID。。如果我对对象保持一个对多的比例,那么我也可以直接获取它们(它们从一开始就是对多的比例)。关键是能够及时检索它们,而不需要创建一个完整的获取、谓词等等,这与nsurl有什么关系?
[[NSUserDefaults standardUserDefaults] setObject:featuredNSManagedObjectIDArray
                                          forKey:@"FeaturedNSManagedObjectIDs"];