Как правильно настроить CNContact.predicateForContacts для выбора поля «электронная почта» в CNContacts? Как в SQL where email like "%lbs%"?

Это моя функция для удаления большого количества импортированных контактов, от которых я хочу избавиться. Но функция возвращает 0 попаданий. Но более 1000 контактов с фунтами в поле электронной почты.

func deleteContacts(){
    let store = CNContactStore()

    let predicate = CNContact.predicateForContacts(matchingName: "lbs")
    let toFetch = [CNContactEmailAddressesKey]

    do{
        let contacts = try store.unifiedContacts(matching: predicate,keysToFetch: toFetch as [CNKeyDescriptor])

        guard contacts.count > 0
            else{
            print("No contacts found")
            return
        }

        guard let contact = contacts.first else{
            return
        }

        let req = CNSaveRequest()
        let mutableContact = contact.mutableCopy() as! CNMutableContact
        req.delete(mutableContact)

        do{
            try store.execute(req)
            print("Success, deleted the data: Count:  \(contacts.count)")
        } catch let e{
            print("Error = \(e)")
        }
    } catch let err{
        print(err)
    }
}
0
Ralf Bordé 18 Фев 2018 в 13:42

1 ответ

Лучший ответ

Ваш предикат пытается найти контакты, в которых имя человека совпадает со строкой lbs.

Нет встроенного предиката для поиска контактов, у которых есть адрес электронной почты, содержащий определенную строку. Решение состоит в том, чтобы использовать enumerateContacts и просмотреть список адресов электронной почты каждого отдельного контакта. Затем вам нужно будет проверить, содержит ли какой-либо адрес электронной почты контакта строку, которую вы хотите проверить.

1
rmaddy 18 Фев 2018 в 20:04