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

vra*_*rao 8 core-data nsfetchrequest ios swift3 ios10

我将联系人tableview控制器中的联系人标识符传递给另一个位置tableview控制器.所以我定义一个委托ContactSelectionDelegate并在Location tableview控制器中实现方法userSelectedContact并获取contactIdentifierString

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

有人可以建议如何使用联系人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)
               }
}
Run Code Online (Sandbox Code Playgroud)

}

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


}
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 22

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

其次,总是把所有好的代码放在do一个do - catch块的范围内.

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) as! [Contact]
        if let aContact = fetchedResults.first {
           providerName.text = aContact.providerName
        }
    }
    catch {
        print ("fetch task failed", error)
    }

}
Run Code Online (Sandbox Code Playgroud)

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

@nonobjc public class func fetchRequest() -> NSFetchRequest<Contact> {
    return NSFetchRequest<Contact>(entityName: "Contact")
}
Run Code Online (Sandbox Code Playgroud)