如何在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
}
}
}
}
首先摆脱所有NSString
和NSDictionary
事件。这是斯威夫特!使用Swift本机结构String
和Dictionary
。
其次,在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 获取非标准(可转换)属性来更新/保存和持久化?