使用简洁的NSManagedObjectID URIforms?

在我的应用程序中,我正在使用Core Data以及不使用Core Data的其他sqlite数据库。 在这个额外的数据库中,我有通过每个实例的NSManagedObjectID存储对NSManagedObject实例的引用的列。

我得到一个实例的objectId作为一个string存储像这样:

 instance.objectID.URIRepresentation.absoluteString 

这导致一个string看起来像这样:

 x-coredata://EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4/ClassName/p658 

我可以稍后使用它来获取NSManagedObject实例,如下所示:

 [persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:uriString]]; 

由于这些URIstring是冗长的,并且包含冗余信息,所以我想只保存每个字段的独特方面,以节省数据库中的空间并提高查询性能。 所以在上面的例子中,只是'658'而不是整个URIstring。

所以第一个问题是:什么是一个很好的方式来提取NSManagedObjectID的唯一尾部? 其次,一旦我有了这个存储,我怎么能以后用它来获取实例呢?

我想避免string操作,因为它感觉很糟糕,但是如果它是唯一的方法,我会考虑它。 我唯一的困惑就是在上面的例子中,“EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4”部分来自哪里。 我怎样才能访问该值,以重build一个有效的URI?

您可以尝试在包含大块数据的属性上设置“允许外部存储”标志,并查看是否消除了对单独的直接pipe理数据库的需求。

否则, URIRepresentation返回一个NSURL ,所以不需要“icky”string操作。 只需使用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被logging为“可存档”,因此Core Data提供给您的组件不会造成任何损坏。 核心数据不知道你把它分开,并把它放在一起。

但是,Apple可以在将来更改URIRepresentation返回的格式,只要managedObjectIDForURIRepresentation:继续接受旧格式。 这意味着URIRepresentation表示的代码有可能在某一天停止工作。