5

我正在尝试在 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 中的转换器值字段留空,因为核心数据文档似乎暗示如果为空则使用默认转换器。

我究竟做错了什么?

4

4 回答 4

1

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

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

于 2012-04-19T15:01:06.690 回答
0

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

我忘记访问 ArchivedID 对象中的属性。那是:

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

应该

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[[defaultConfiguration.archiveID anyObject] idURI]];
于 2012-04-19T15:10:58.563 回答
0

嗯。似乎有一种更简单的方法可以使用 CoreData 执行此操作。请记住,CoreData 是一个对象图。它擅长跟踪关系。

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

于 2012-04-19T16:14:34.460 回答
-1

我喜欢@kevboh 的建议。您也可以考虑将objectID特定NSManagedObjects 的 s 存储在NSUserDefaults. 例如:

[[NSUserDefaults standardUserDefaults] setObject:featuredNSManagedObjectIDArray
                                          forKey:@"FeaturedNSManagedObjectIDs"];
于 2012-04-19T15:20:01.690 回答