2017-01-13 2 views
2

Я передаю контакт Идентификатор из диспетчера таблицы таблиц контактов в другой контроллер табличного представления Location. Поэтому я определяю делегата ContactSelectionDelegate и реализую метод userSelectedContact в контроллере Location tableview и получаю contactIdentifierStringКак использовать предикаты с fetchRequest в данных ядра

Я ищу базу данных, чтобы найти соответствие для contactIdentifierString и найти значение для другого имени поставщика атрибутов. Это предполагает поиск всей базы данных. Есть ли более быстрый способ, назначая предикат контексту fetchRequest. Я думал, что это будет быстрее и меньше строк кода.

Может кто-нибудь предложить, как использовать предикаты с помощью контакта 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 
      } 
     } 
    } 


} 

ответ

9

Прежде всего избавиться от всех 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") 
} 
+0

Я получаю ошибку Контакт на этой линии : «Использование Ambiguoius fetchrequest». let fetchRequest = Contact.fetchRequest() – vrao

+0

Изменено: let req: NSFetchRequest = Contact.fetchRequest(). Теперь я получаю ошибку: использование необъявленного типа NSFetchRequest. Похоже, у меня нет подклассов NSManagedObject. Итак, сгенерированные подклассы NSManagedObject для обоих объектов. Я получаю ошибку в объекте Contact внутри Contact + CoreDataProperties.swift, поскольку «Contact является неоднозначным для поиска по типу в этом контексте». Может быть, классы NSManagedObject получили автогенерирование. Кружение с ошибками. Можете ли вы пл. объяснить и как исправить? – vrao

+1

Я предполагал, что вы используете подкласс NSManagedObject, так как к «providerName» обращается точка с нотной точкой. Подкласс должен содержать метод 'fetchRequest()'. Я обновил ответ. – vadian