首页 > 解决方案 > 有没有办法访问从 NSFetchRequest 返回的 x-coredata:// 对象的属性?

问题描述

TL;DR:有没有办法使用附加在实例的 x-coredata:// 标识符上的 p 编号“序列号”以编程方式读取/调用(不是写入!)核心数据实体的实例?这是一个好/坏主意吗?

我正在使用类似于以下的方法来检索从核心数据数据存储中调用的实体的实例:

var managedContext: NSManagedObjectContext!

let fetchRequest : NSFetchRequest<TrackInfo> = TrackInfo.fetchRequest()
        fetchResults = try! managedContext.fetch(fetchRequest)
        for (i, _) in Global.Vars.numberOfTrackButtons! {


        let workingTrackInfo = fetchResults.randomElement()!
        print("current track is: \(workingTrackInfo)")

曲目列表以数组形式返回 fetchResults,我可以随机选择其中一个 ( fetchResults.randomElement())。print从那里,我可以通过将它强制为一个字符串并在控制台(语句)中显示它来检查该项目的详细信息。我没有列出下面的代码,但是使用workingTrackInfo我可以看到该实例,将其属性读入其他变量等。

在控制台中,iOS/Xcode 将选中的项列出如下:

current track is: <MyProjectName.TrackInfo: 0x60000374c2d0> (entity:
TrackInfo; id: 0xa7dc809ab862d89d 
<x-coredata://2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7/TrackInfo/p22>; 
data: <fault>)

开头的那行x-coredata:引起了我的注意。它的格式像一个 URL,由我认为是与应用程序的当前构建相关联的特定核心数据存储的 UUID 组成(即不是一个可以硬编码的稳定地址;您需要以编程方式查找核心数据store,类似于我们用于以编程方式定位 Documents 文件夹、App Bundle 等的函数。)第三项是我的 Core Data 模型中的实体名称——很简单。

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

我对试图绕过 Core Data 的正常机制来修改托管对象的内容不感兴趣。苹果很清楚这是一个坏主意。

感兴趣的是是否可以使用这个“序列号”来处理特定的核心数据实例。**

在我的应用程序中,我从可能数百甚至数千首曲目中随机选择一首曲目,除其他外,我感兴趣的是基于该p-number连续剧选择单个曲目的能力,其中我只是通过生成一个 random 来请求一个单独的实例p-number,将它附加到一个 x-coredata:// 格式如上面列出的语句中,然后将结果(在只读的基础上!)加载到一个变量中以供进一步使用应用程序的其他地方。

出于测试目的,我尝试简单地硬编码x-coredata://2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7/TrackInfo/p22为 URL,但 XCode 似乎不喜欢它。是否有其他数据类型(例如 NSManagedObject?)允许您将 x-coredata://“URL”设置为其内容?

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

谢谢!

标签: iosswiftcore-data

解决方案


你很接近。

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

是记录uriRepresentation()NSManagedObjectID的。

您从 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)
}

推荐阅读