【问题标题】:Fetching objects from core data entity retrieves wrong object从核心数据实体中获取对象检索到错误的对象
【发布时间】:2021-05-31 23:41:51
【问题描述】:

我有这个实体类通过它的id 检索一个对象。如果找不到对象,则创建一个并返回。

  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 调用它。 “新项目”部分将第一次运行。所有其他时间都将返回创建的第一个对象,并且该对象的 id 与传递给方法的 id 无关。

为什么?

【问题讨论】:

  • PatientObject 的子类吗?
  • 这是一个错误。固定

标签: swift core-data swift5


【解决方案1】:

检查您是否正在为每个循环创建一个提取请求。 fetch var 是初始化一次的静态属性。这是一个单发对象,正在返回第一次发射的结果。

你可以通过改变来做到这一点:

static var request:NSFetchRequest&lt;NSFetchRequestResult&gt;

static func freshRequest() -&gt; NSFetchRequest&lt;NSFetchRequestResult&gt;

您可能还想在新的Patient 对象上设置id,然后再返回它。

let patient =  Patient(context: context)
patient.id = id
return patient

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多