【问题标题】:Core Data fetching with objectID使用 objectID 获取核心数据
【发布时间】:2020-09-20 19:19:03
【问题描述】:

我的数据模型中有 2 个实体,如下图所示:

产品:

出席:

我正在保存具有出勤关系的产品!现在,我需要获取具有特定 Attendance.objectID 的产品

我正在尝试以下代码:

func fetchProducts() {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    
    let managedContext = appDelegate.managedObjectContext
    
    let fetchRequest = NSFetchRequest(entityName: "Product")
    let attendancePredicate = NSPredicate(format: "attendance.objectID == \(currAttendance.objectID)")
    fetchRequest.predicate = attendancePredicate
    
    print("Att = \(currAttendance.name!)")
    viewTypeSKU.hidden = true
    
    do {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        products = results as! [NSManagedObject]
    } catch let error as NSError {
        print("Could not fetch \(error), \(error.userInfo)")
    }

}

我收到错误:'Unable to parse the format string "attendance.objectID ==

【问题讨论】:

  • 什么是 currAttendance?你从哪里抓到的?
  • 试试NSPredicate(format: "attendance.objectID = %@", currAttendance.objectID)
  • 你也可以设置一个逆向,这样你就可以做 currAttendance.product 并完成它。
  • 为什么要在谓词中匹配对象 ID?这几乎不是解决任何问题的正确方法。

标签: swift core-data


【解决方案1】:

在提取内部SELFNSManagedObjectIDNSManagedObject 相当。但是,您不能对正在获取的项目执行.objectID。我的理论是这是因为在执行. 时,它正在寻找.objectIDNSManagedObject 一部分的特定实体的属性和/或关系。不过我可能是错的。

但是,如果您只是将 NSPredicate 切换到其中之一,它将起作用。

NSPredicate(format: "attendance == %@", currAttendance.objectID)

NSPredicate(format: "attendance == %@", currAttendance)

【讨论】:

  • @Ula 这很有趣,我一直认为 = 与 NSPredicates 中的 == 相同。两种方法都试过了吗?
  • 坦率地说,不是。我只是假设它应该是双倍的。我不知道它会双向工作。但老实说,我更喜欢这种方式,只是为了保持良好的做法。不管怎样,添加“.objectID”对我有帮助,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多