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菜鸟,所以我不知道我所不知道的东西;请幽默我!);这些类型的语句的语法/方法是什么?
谢谢!
答案 0 :(得分:1)
你很亲密。
x-coredata:// 2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7 / TrackInfo / p22
是记录NSManagedObjectID的uriRepresentation()
。
您可以使用以下方法从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)
}