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

问题描述 投票:5回答:1

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

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

有人可以建议如何使用联系人fetchRequest来使用谓词吗?

联系TableViewController代码:

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

}

位置TableViewController代码:

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


}
ios core-data swift3 ios10 nsfetchrequest
1个回答
20
投票

首先摆脱所有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)
    }

}

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

@nonobjc public class func fetchRequest() -> NSFetchRequest<Contact> {
    return NSFetchRequest<Contact>(entityName: "Contact")
}
© www.soinside.com 2019 - 2024. All rights reserved.