问题描述
我将联系人标识符从联系人表视图控制器传递到另一个位置表视图控制器.所以我定义了一个委托 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
}
}
}
}
推荐答案
首先去掉所有出现的 NSString
和 NSDictionary
.这是斯威夫特!.使用 Swift 原生结构 String
和 Dictionary
.
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 的谓词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!