2012-04-19 103 views
5

我想在核心数据对象中存档/取消存档NSManagedObjectIDs,这样下次我的应用程序启动时,我可以检索这些ID并使用它们来获取特定的对象。在核心数据中存储NSURL的正确方法是什么?

我尝试“存档”的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

这与nsurl有什么关系? – Chet 2014-03-23 04:59:55

回答

0

好吧......它已经连续14小时的编码..我..一..诶白痴:

我忘了访问属性的ArchivedID对象。那就是:

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

应该

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

这也起作用:) – kevboh 2012-04-19 15:16:20

1

您可以在不存储URL的情况下解决此问题。考虑向你的模型添加一个布尔标志并将你希望检索的对象标记为true,然后在你的应用下次启动时获取标记的对象。

但是,您可以尝试获取URL的字符串版本-absoluteString并存储它。

+0

如果你采取这种方法,一定要检查布尔属性上的“索引”框,因为你将基于该标志进行提取。 – ma11hew28 2012-04-19 15:14:42

-1

我喜欢什么@kevboh建议。您也可以考虑将的objectID存储在NSUserDefaults中。例如:

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

kevboh的方式工作,但增加了额外的间接水平。我做得很好,只是我有一个错字。 – SaldaVonSchwartz 2012-04-20 15:00:53

0

嗯。似乎有一个更简单的方法来与CoreData做到这一点。请记住,CoreData是一个对象图。善于跟踪关系。

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

+0

存档的URL方法允许通过JSON等传递ID。如果我保留一对多的对象,我可能只需要获取它们(它们在一开始就是一对一的)。整个问题的关键是能够及时检索它们,而不必创建一个完整的获取,谓词, – SaldaVonSchwartz 2012-04-20 15:03:45

相关问题