web-dev-qa-db-fra.com

Comment utiliser les prédicats avec fetchRequest dans Core Data

Je transmets un identifiant de contact du contrôleur de table Contacts à un autre contrôleur de table Table Location. Je définis donc un délégué ContactSelectionDelegate et implémente la méthode userSelectedContact dans le contrôleur de table Location Location et j'obtiens contactIdentifierString

Je recherche la base de données pour trouver une correspondance pour contactIdentifierString et trouver une valeur pour un autre nom de fournisseur d'attribut. Cela implique une recherche dans toute la base de données. Existe-t-il un moyen plus rapide en attribuant un prédicat au contexte fetchRequest. Je pensais que ce serait plus rapide et moins de lignes de code.

Quelqu'un peut-il suggérer comment utiliser les prédicats avec contact fetchRequest?

Code 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)
               }
}

}

Code 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
            }
        }
    }


}
7
vrao

Tout d'abord, supprimez toutes les occurrences NSString et NSDictionary. C'est Swift !. Utilisez les structures natives Swift String et Dictionary.

Deuxièmement, mettez toujours tout bon code dans la portée do d'une do - catch bloquer.

Un prédicat CoreData a un format simple attribute == value qui est très similaire à 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)
    }

}

Le code suppose qu'il existe une sous-classe NSManagedObjectContact contenant

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