如何在 Core Data 中使用带有 fetchRequest 的谓词 [英] How to use predicates with fetchRequest in Core Data

查看:13
本文介绍了如何在 Core Data 中使用带有 fetchRequest 的谓词的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I pass a contact Identifier from Contacts tableview controller to another Location tableview controller. So I define a delegate ContactSelectionDelegate and implement method userSelectedContact in Location tableview controller and get contactIdentifierString

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

I am searching the database to find a match for contactIdentifierString and find value for another attribute provider name. This involves searching the whole database. Is there a faster way by assigning a predicate to the context fetchRequest. I thought that would be faster and fewer lines of code.

有人可以建议如何使用带有 contact fetchRequest 的谓词吗?

Can someone suggest how to use predicates with contact fetchRequest?

ContactTableViewController 代码:

ContactTableViewController code:

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 代码:

LocationTableViewController code:

 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.

First of all get rid of all NSString and NSDictionary occurrences. This is Swift!. Use the Swift native structs String and Dictionary.

其次,将所有好的代码放在do - catch块的do范围内.

Second of all put always all good code in the do scope of a do - catch block.

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

A CoreData predicate has a simple format attribute == value which is very similar to 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 包含

The code assumes that there is a NSManagedObject subclass Contact containing

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

这篇关于如何在 Core Data 中使用带有 fetchRequest 的谓词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆