从核心数据实体中获取对象会检索到错误的对象

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
    }
  }

我从核心数据中删除了所有对象。我 运行 这是一个循环。每次循环迭代时,都会使用不同的 idcreateIfNotFound = 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