是否可以访问从NSFetchRequest返回的x-coredata://对象的属性?

时间:2019-01-11 19:02:53

标签: ios swift core-data

TL; DR:有一种方法可以使用附加到实例的x-coredata上的p编号的“序列号”以编程方式读取/调用(不写!)Core Data实体的实例: //标识符?这是个好主意吗?

我正在使用与以下类似的方法来检索从Core Data数据存储区调用的Entity的实例:

fetchResults.randomElement()

轨道列表以数组形式返回到fetchResults中,我可以随机选择其中一个(print)。从那里,我可以通过将一项强制为字符串并将其显示在控制台中(workingTrackInfo语句)来检查该项的详细信息。我没有在下面列出代码,但是使用current track is: <MyProjectName.TrackInfo: 0x60000374c2d0> (entity: TrackInfo; id: 0xa7dc809ab862d89d <x-coredata://2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7/TrackInfo/p22>; data: <fault>) 可以看到该实例,将其属性读取到其他变量中,等等。

在控制台中,iOS / Xcode列出选定的项目,如下所示:

x-coredata:

p-number开头的行引起了我的注意。它的格式类似于URL,由我假设是与应用程序当前版本关联的特定Core Data存储的UUID(即,不是可以硬编码的稳定地址;您需要以编程方式查找Core Data存储,类似于我们用于以编程方式查找Documents Folder,App Bundle等的功能。)第三项是我的Core Data模型中的Entity的名称-很容易。

但是最后一个数字是我很好奇的。通过检查与此数据存储关联的SQLite数据库,它似乎是一种与数据模型中的Z_PK字段关联的“实例序列号”。

我不对尝试绕过Core Data的正常机制修改托管对象的内容不感兴趣。苹果very clear认为这是个坏主意。

我感兴趣的是是否可以使用此“序列号”寻址特定的Core Data实例。**

在我的应用程序中,我从数百条甚至数千条轨道中随机选择一条轨道,除此以外,我会对基于此选择单个轨道的能力感兴趣。 p-number序列,这​​里我只是通过生成一个随机的x-coredata://2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7/TrackInfo/p22来请求一个单独的实例,然后将其附加到x-coredata://语句(格式与上面列出的一样),然后将结果加载到只读)!将其放入变量中,以便在应用程序中的其他地方进一步使用。

出于测试目的,我尝试将{{1}}硬编码为URL,但是XCode似乎不喜欢它。还有其他一些数据类型(例如NSManagedObject吗?),可以将x-coredata://“ URL”设置为其内容?

问题:有没有人做过这样的事情?是否有任何内存/线程方面的考虑,为什么以这种方式获取实例名称不是一个好主意(我是iOS / Core Data菜鸟,所以我不知道我所不知道的东西;请幽默我!);这些类型的语句的语法/方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

你很亲密。

  

x-coredata:// 2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7 / TrackInfo / p22

是记录NSManagedObjectIDuriRepresentation()

您可以使用以下方法从NSManagedObject获取此URL:

let workingTrackInfo = fetchResults.randomElement()!
let objectIDURL = workingTrackInfo.objectID.uriRepresentation()

使用此URL,您可以从NSPersistentStoreCoordinator获取管理对象ID,并从管理对象上下文中获取协调器。
然后在上下文上调用object(with:以获取对象。

let persistentStoreCoordinator = managedContext.persistentStoreCoordinator!
if let objectID = persistentStoreCoordinator.managedObjectID(forURIRepresentation: objectIDURL) {
    let object = managedContext.object(with: objectID) as! TrackInfo
    print(object)
}