在我的应用程序中,我使用 Core Data 以及不使用 Core Data 的附加 sqlite 数据库。在这个附加数据库中,我有一些列存储对NSManagedObject
实例通过每个实例的NSManagedObjectID
.
我得到一个实例objectId
作为存储的字符串,如下所示:
instance.objectID.URIRepresentation.absoluteString
这会导致字符串看起来像这样:
x-coredata://EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4/ClassName/p658
我稍后可以用它来获取NSManagedObject
像这样的实例:
[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:uriString]];
由于这些 URI 字符串很冗长并且包含冗余信息,因此我想仅保存每个字符串的独特方面,以节省数据库空间并提高查询性能。因此,在上面的示例中,只是“658”而不是整个 URI 字符串。
所以第一个问题是:什么是提取唯一尾部的好方法?NSManagedObjectID
?其次,一旦我存储了它,我以后如何使用它来获取实例?
我想避免字符串操作,因为这感觉很恶心,但如果这是唯一的方法,我会考虑它。我唯一的困惑是上面示例中的“EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4”部分来自何处。我如何访问该值以重建有效的 URI?
您可以尝试在包含大量数据的属性上设置“允许外部存储”标志,并查看是否不需要单独的、直接管理的数据库。
否则,URIRepresentation
返回一个NSURL
,因此不需要“讨厌的”字符串操作。只需使用NSURL
方法。 ;^) 下面是如何分解它:
NSURL *instanceURL = instance.objectID.URIRepresentation;
NSURL *classURL = [instanceURL URLByDeletingLastPathComponent];
NSString *classString = [classURL absoluteString];
NSString *instanceId = [instanceURL lastPathComponent];
以下是稍后将其重新组合在一起的方法:
NSURL *reconstructedClassURL = [NSURL URLWithString:classString];
NSURL *reconstructedInstanceURL = [reconstructedClassURL
URLByAppendingPathComponent:instanceId];
NSManagedObjectID *objectID = [moc.persistentStoreCoordinator
managedObjectIDForURIRepresentation:reconstructedInstanceURL];
NSManagedObject *reconstructedInstance = [moc objectWithID:objectID];
请注意,自从URIRepresentation
被记录为“可存档”,因此从 Core Data 提供给您的组件重建一个并没有什么坏处。 Core Data 不知道您将其拆开并重新组装在一起。
但是,Apple 可以更改返回的格式URIRepresentation
未来,只要managedObjectIDForURIRepresentation:
继续接受旧格式。这意味着上面的代码分解了URIRepresentation
could有一天停止工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)