Swift 5 个使用 UUID 的 CoreData 谓词
Swift 5 CoreData predicate using UUID
我有一个实体,我为其设置了一些 ID 作为 UUID 对象。
我有这个功能来检查它是否已经记录在持久存储中。
我发现了一些不起作用的示例,因为该示例使用了一些在 swift.
中不起作用的“NSPredicate(format: "%K == %@", #KeyPath(attribute), id)
”代码
所以我想在 swift 中弄清楚我是如何处理这个问题的。我不想将 UUID 存储为简单的字符串,因为 coreData 允许我们保存 UUID 对象。
我有这个方法,但它在 NSPredicate 行上崩溃了:
static func isKnownBikeID(_ bleID: UUID) -> Bool {
let context = A18DataStore.shared.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Bike")
fetchRequest.predicate = NSPredicate(format: "%K == %@", [\Bike.bleID , bleID] as CVarArg)
do{
let bikes = try context.fetch(fetchRequest)
return bikes.count > 0
}
catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
return false
}
编辑:我的当前方法出现异常:
2021-07-16 11:55:28.390629-0400 A18 UAT[9260:4171027] -[Swift.__SwiftDeferredNSArray rangeOfString:]: unrecognized selector sent to instance 0x282c22cc0
在@Larme 的帮助下
static func isKnownBikeID(_ bleID: UUID) -> Bool {
let context = A18DataStore.shared.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Bike")
fetchRequest.predicate = NSPredicate(format: "%K == %@", "bleID" , bleID as CVarArg)
do{
let bikes = try context.fetch(fetchRequest)
return bikes.count > 0
}
catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
return false
}
@vadian 说的对。
我的例子是要求在关键路径上做一些操作,所以我最初明白我必须使用一些 .bleID 东西来让它工作,是的,只需使用字段的名称就可以。
%K
格式需要一个关键路径字符串,这可以使用 #keyPath
指令获得。
%@
格式需要一个Objective-C对象,这里我们可以使用UUID
和NSUUID
之间的免费桥接。
这给出:
let predicate = NSPredicate(format: "%K == %@",
#keyPath(Bike.bleID), bleID as NSUUID)
我有一个实体,我为其设置了一些 ID 作为 UUID 对象。 我有这个功能来检查它是否已经记录在持久存储中。
我发现了一些不起作用的示例,因为该示例使用了一些在 swift.
中不起作用的“NSPredicate(format: "%K == %@", #KeyPath(attribute), id)
”代码
所以我想在 swift 中弄清楚我是如何处理这个问题的。我不想将 UUID 存储为简单的字符串,因为 coreData 允许我们保存 UUID 对象。
我有这个方法,但它在 NSPredicate 行上崩溃了:
static func isKnownBikeID(_ bleID: UUID) -> Bool {
let context = A18DataStore.shared.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Bike")
fetchRequest.predicate = NSPredicate(format: "%K == %@", [\Bike.bleID , bleID] as CVarArg)
do{
let bikes = try context.fetch(fetchRequest)
return bikes.count > 0
}
catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
return false
}
编辑:我的当前方法出现异常:
2021-07-16 11:55:28.390629-0400 A18 UAT[9260:4171027] -[Swift.__SwiftDeferredNSArray rangeOfString:]: unrecognized selector sent to instance 0x282c22cc0
在@Larme 的帮助下
static func isKnownBikeID(_ bleID: UUID) -> Bool {
let context = A18DataStore.shared.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Bike")
fetchRequest.predicate = NSPredicate(format: "%K == %@", "bleID" , bleID as CVarArg)
do{
let bikes = try context.fetch(fetchRequest)
return bikes.count > 0
}
catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
return false
}
@vadian 说的对。
我的例子是要求在关键路径上做一些操作,所以我最初明白我必须使用一些 .bleID 东西来让它工作,是的,只需使用字段的名称就可以。
%K
格式需要一个关键路径字符串,这可以使用#keyPath
指令获得。%@
格式需要一个Objective-C对象,这里我们可以使用UUID
和NSUUID
之间的免费桥接。
这给出:
let predicate = NSPredicate(format: "%K == %@",
#keyPath(Bike.bleID), bleID as NSUUID)