使用 UUID 获取核心数据

Fetch Core Data using UUID

如何使用对象的 UUID 获取对象?我有一个对象 (TimeCode),它在 xcdatamodel 文件中具有 id 类型的 UUID 属性。我想通过在标准 NSPredicate 中使用此 id 属性从 CoreData 获取此类型的对象,但我收到一个编译错误,指出我必须使用 id 作为 CVarArg。但是在运行时,当我实际调用函数时,程序崩溃了,因为 ObjectIdentifier 类型无法转换为 CVarArg.

完整代码如下:

func fetchTimeCode(id: ObjectIdentifier) -> TimeCode? {
        var timeCodes = [TimeCode]()
        
        let request: NSFetchRequest<TimeCode> = TimeCode.fetchRequest()
        
        request.predicate = NSPredicate(format: "id ==  %@", id as! CVarArg)
        
        do {
            timeCodes = try self.moc.fetch(request)
        }
        catch let error as NSError {
            print("Error fetching for editing.")
            print(error)
        }
        
        print("fetch request id: \(id)")
        
        return timeCodes.first
    }

如有任何帮助,我们将不胜感激。我似乎无处不在,找不到任何答案。现在看来最好的解决方案是将 id 存储为字符串,但这似乎不是特别优雅。如果您不能使用 UUID 轻松获取对象,那么为您的对象设置 UUID 有什么意义?

更新:这是我的 TimeCodeViewModel class.

代码
class TimeCodeViewModel: Identifiable {
    var id: ObjectIdentifier
    var fullName = ""
    
    
    init(timeCode: TimeCode) {
        self.id = timeCode.id
        self.fullName = timeCode.fullName!
    }
    
    // class methods
}

在我的例子中,它适用于以下谓词:

func getItem(with id: UUID?) -> Item? {
    guard let id = id else { return nil }
    let request = Item.fetchRequest() as NSFetchRequest<Item>
    request.predicate = NSPredicate(format: "%K == %@", "id", id as CVarArg)
    guard let items = try? context.fetch(request) else { return nil }
    return items.first
}

更重要的是,我使用的是UUID(同样的情况在Martin建议的答案中),而不是ObjectIdentifier。绝对可以根据 UUID.

获取项目

请尝试将函数中的参数类型更改为 UUID