如何在 Core Data 中使用带有 fetchRequest 的谓词

How to use predicates with fetchRequest in Core Data

我将联系人标识符从联系人表视图控制器传递到另一个位置表视图控制器。所以我定义了一个委托 ContactSelectionDelegate 并在 Location 表视图控制器中实现方法 userSelectedContact 并获取 contactIdentifierString

我正在搜索数据库以查找 contactIdentifierString 的匹配项并查找另一个属性提供程序名称的值。这涉及搜索整个数据库。通过将谓词分配给上下文 fetchRequest 是否有更快的方法。我认为那样会更快,代码行更少。

有人可以建议如何将谓词与 contact fetchRequest 一起使用吗?

ContactTableViewController 代码:

protocol ContactSelectionDelegate{
func userSelectedContact(contactIdentifier:NSString)
}

class ContactTableViewController: UITableViewController {

var delegate:ContactSelectionDelegate? = nil

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if (delegate != nil){
        let contactDict:NSDictionary = allContacts.object(at: indexPath.row) as! NSDictionary
        let identifier = contactDict.object(forKey: "uniqueId")
                   delegate!.userSelectedContact(contactIdentifier: identifier as! NSString)
                  self.navigationController!.popViewController(animated: true)
               }
}

}

LocationTableViewController 代码:

 class LocationTableViewController: UITableViewController, ContactSelectionDelegate, CLLocationManagerDelegate {

var contactIdentifierString:NSString = NSString()

 func userSelectedContact(contactIdentifier: NSString) {
    var fetchedResults: [Contact] = []

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    do {
        fetchedResults = try context.fetch(Contact.fetchRequest())
    }
    catch {
        print ("fetch task failed")
    }
    if fetchedResults.count > 0 {
        for contact in fetchedResults{
            let aContact:Contact = contact
            if (aContact.uniqueId! == contactIdentifierString as String) {
                providerName.text = aContact.providerName
            }
            else {
                continue
            }
        }
    }


}

首先摆脱所有 NSStringNSDictionary 事件。这是 Swift!。使用 Swift 本机结构 StringDictionary.

其次始终将所有 好的 代码放在 do - catch 块的 do 范围内。

CoreData 谓词具有简单的格式 attribute == value,与 aContact.uniqueId! == contactIdentifierString:

非常相似
var contactIdentifierString = ""

func userSelectedContact(contactIdentifier: String) {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    do {
        let fetchRequest : NSFetchRequest<Contact> = Contact.fetchRequest()
        fetchRequest.predicate = NSPredicate(format: "uniqueId == %@", contactIdentifier)
        let fetchedResults = try context.fetch(fetchRequest)
        if let aContact = fetchedResults.first {
           providerName.text = aContact.providerName
        }
    }
    catch {
        print ("fetch task failed", error)
    }

}

代码假定有一个NSManagedObject子类Contact包含

@nonobjc public class func fetchRequest() -> NSFetchRequest<Contact> {
    return NSFetchRequest<Contact>(entityName: "Contact")
}