使用 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
如何使用对象的 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