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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Core Data中使用带有fetchRequest的谓词相关的知识,希望对你有一定的参考价值。

我将联系人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
            }
        }
    }


}
答案

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

以上是关于如何在Core Data中使用带有fetchRequest的谓词的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Swift 的 Core Data 获取非标准(可转换)属性来更新/保存和持久化?

如何防止备份带有外部文件的 Core Data 数据库?

iPhone4 Core Data如何插入带有节号的新对象?

显示带有来自 Core Data 的布尔值的 .sheet

带有命令行界面的 Core Data Cocoa 应用程序

带有 Core Data 陡峭学习曲线的 RestKit 0.10.1