从核心数据实体中获取对象会检索到错误的对象
Fetching objects from core data entity retrieves wrong object
我有这个实体 class 可以通过其 id
检索对象。如果找不到该对象,则创建一个并 return.
static var request:NSFetchRequest<NSFetchRequestResult> {
let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: String(describing: Self.self))
request.returnsDistinctResults = true
request.returnsObjectsAsFaults = true
return request
}
class func readObjectWith(id:String,
createIfNotFound:Bool = false,
context:NSManagedObjectContext) -> Object? {
// search for the object
let predicate = NSPredicate(format: "id == \(id)")
request.predicate = predicate
do {
guard let result = try context.fetch(request) as? [Object],
result.count > 0,
let item = result.first
else {
if createIfNotFound == false { return nil }
print("new item")
return Object(context: context)
}
// item exists, return
return item
} catch {
return nil
}
}
我从核心数据中删除了所有对象。我 运行 这是一个循环。每次循环迭代时,都会使用不同的 id
和 createIfNotFound = true
调用它。 “新项目”部分将只是 运行 第一次。所有其他时间创建的第一个对象将被 returned,并且该对象的 id 与传递给方法的 id
无关。
为什么?
检查您是否在为每个循环创建提取请求。 fetch
var 是一个初始化一次的静态 属性。这是一个单发对象,返回第一次发射的结果。
您可以通过更改来做到这一点:
static var request:NSFetchRequest<NSFetchRequestResult>
到
static func freshRequest() -> NSFetchRequest<NSFetchRequestResult>
您可能还想在返回之前在新的 Patient
对象上设置 id
。
let patient = Patient(context: context)
patient.id = id
return patient
我有这个实体 class 可以通过其 id
检索对象。如果找不到该对象,则创建一个并 return.
static var request:NSFetchRequest<NSFetchRequestResult> {
let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: String(describing: Self.self))
request.returnsDistinctResults = true
request.returnsObjectsAsFaults = true
return request
}
class func readObjectWith(id:String,
createIfNotFound:Bool = false,
context:NSManagedObjectContext) -> Object? {
// search for the object
let predicate = NSPredicate(format: "id == \(id)")
request.predicate = predicate
do {
guard let result = try context.fetch(request) as? [Object],
result.count > 0,
let item = result.first
else {
if createIfNotFound == false { return nil }
print("new item")
return Object(context: context)
}
// item exists, return
return item
} catch {
return nil
}
}
我从核心数据中删除了所有对象。我 运行 这是一个循环。每次循环迭代时,都会使用不同的 id
和 createIfNotFound = true
调用它。 “新项目”部分将只是 运行 第一次。所有其他时间创建的第一个对象将被 returned,并且该对象的 id 与传递给方法的 id
无关。
为什么?
检查您是否在为每个循环创建提取请求。 fetch
var 是一个初始化一次的静态 属性。这是一个单发对象,返回第一次发射的结果。
您可以通过更改来做到这一点:
static var request:NSFetchRequest<NSFetchRequestResult>
到
static func freshRequest() -> NSFetchRequest<NSFetchRequestResult>
您可能还想在返回之前在新的 Patient
对象上设置 id
。
let patient = Patient(context: context)
patient.id = id
return patient