如何在Core Data中使用fetchRequest谓词
我将联系人标识符从联系人表视图控制器传递到另一个位置表视图控制器。 所以我定义了一个委托ContactSelectionDelegate,并在Location tableview控制器中实现了方法userSelectedContact,并获取contactIdentifierString
我正在search数据库以查找contactIdentifierString的匹配项,并查找另一个属性提供程序名称的值。 这涉及到search整个数据库。 是否有更快的方式分配一个谓词到上下文fetchRequest。 我认为这将是更快,更less的代码行。
有人可以build议如何使用联系fetchRequest谓词?
ContactTableViewController代码:
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代码:
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! 使用Swift本地结构String
和Dictionary
。
其次,在do - catch
块的范围内总是放置所有的好代码。
一个CoreData谓词有一个简单的格式attribute == value
,它非常类似于aContact.uniqueId! == contactIdentifierString
aContact.uniqueId! == contactIdentifierString
:
var contactIdentifierString = "" func userSelectedContact(contactIdentifier: String) { let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext do { let formatRequest : 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<Instrument>(entityName: "Contact") }