首页 > 解决方案 > 使用关系的 CoreData 谓词

问题描述

我有两个实体 -QuotesCustomers. 一位客户可以有多个报价。关系是quotescustomers

我想根据客户姓名和电子邮件地址获取报价对象,按日期排序,但我一直在尝试格式化谓词...

func getMostRecentQuote(name: String, email: String) -> Quotes? {
   var predicateList = [NSPredicate]()
   let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Quotes")
   let predicate1 = NSPredicate(format: "name CONTAINS[c] %@", name)
   let predicate2 = NSPredicate(format: "email CONTAINS[c] %@", email)
   let orCompoundPredicate = NSCompoundPredicate(type: .or, subpredicates: [predicate1, predicate2])
   predicateList.append(orCompoundPredicate)

   fetchRequest.predicate = NSCompoundPredicate(type: .and, subpredicates: predicateList)
   fetchRequest.fetchLimit = 1

标签: swiftcore-datapredicate

解决方案


Quotes可能您与to有一对一的关系Customers,如果没有,请建立一个并命名该属性customer

然后使用这个单一的谓词

let predicate = NSPredicate(format: "customer.name CONTAINS[c] %@ OR customer.email CONTAINS[c] %@", name, email)

如果要过滤整个字符串不区分大小写CONTAINS实际上是错误的运算符,最好使用LIKE

let predicate = NSPredicate(format: "customer.name LIKE[c] %@ OR customer.email LIKE[c] %@", name, email)

 

注意:请以单数形式命名实体,从语义上讲,您的方法将返回一个Quote,而不是一个Quotes


推荐阅读