【问题标题】:what's the correct way to store an NSURL in Core Data?在 Core Data 中存储 NSURL 的正确方法是什么?
【发布时间】:2012-05-01 03:06:09
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 这和nsurl有什么关系?

标签: ios cocoa core-data foundation nsvaluetransformer


【解决方案1】:

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

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

【讨论】:

  • 如果您采用这种方法,请务必选中布尔属性上的“索引”框,因为您将根据该标志进行获取。
【解决方案2】:

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

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

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

应该是

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 存档的 URL 方法允许通过 JSON 等传输 ID。如果我对对象保留一对多,我不妨只获取它们(它们是一对多到从...开始)。重点是能够及时检索它们,而无需创建整个 fetch、predicate、whatnot,
    【解决方案4】:

    我喜欢@kevboh 的建议。您还可以考虑将特定NSManagedObjects 的objectIDs 存储在NSUserDefaults 中。例如:

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

    【讨论】:

    • kevboh 的方式有效,但增加了额外的间接级别。我的方法很好,只是我有一个错字。
    猜你喜欢
    • 2016-11-12
    • 2011-01-02
    • 2012-12-28
    • 2013-02-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多