2016-12-06 1 views
1

Я новичок в языке Swift 3, и я хочу получить контакты с телефона в массиве, а затем сохранить в sqliteDB. Пожалуйста помоги.Извлечение контактов из мобильных и магазинов в sqliteDB с использованием Swift 3

Я видел старый учебник Swift 2.1, но все эти методы устарели, и я много пробовал с CNContacts, но это не помогло мне.

Я также попробовал эту ссылку переполнение стека, но не получают никакой помощи:
Fetching all contacts in ios Swift?

+0

Не могли бы вы показать нам, что вы пробовали уже до этого? – Randy

+0

Извините, я отменил весь свой код, потому что он не работал. –

+0

Вы действительно хотите хранить свои контакты в базе данных sqlite? У вас есть отличные альтернативы. Обычно я использую [Realm] (https://realm.io/), но вы также можете использовать [CoreData] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/index. html? utm_source = iosstash.io) И чтобы получить контакты, пожалуйста, проверьте [этот ответ] (http://stackoverflow.com/a/34095632/3844377) – Randy

ответ

0

Я просто работаю над подобной проблемой, так что я дам вам свой код. Я собрал его из нескольких разных тем, которые я нашел (включая this). Наше требование, чтобы просто получить номер телефона в одиночку от всех контактов и поместить его в массив строк, но вы можете легко изменить это, чтобы сделать больше:

func getContacts(){ 

    contactStore.requestAccess(for: .contacts, completionHandler: { 
     granted, error in 

     var contacts: [CNContact] = { 
      let contactStore = CNContactStore() 

      //Change keys here to retreive more than just the phone number of the contact 
      let keysToFetch = [CNContactPhoneNumbersKey] 

      // Get all the containers 
      var allContainers: [CNContainer] = [] 
      do { 
       allContainers = try contactStore.containers(matching: nil) 
      } catch { 
       print("Error fetching containers") 
      } 

      var results: [CNContact] = [] 

      // Iterate all containers and append their contacts to our results array 
      for container in allContainers { 

       let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier) 

       do { 

        let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as [CNKeyDescriptor]) 

        results.append(contentsOf: containerResults) 

        for phone in results{ 

         for labeledValue in phone.phoneNumbers{ 
          self.phoneNumbersArray.append(labeledValue.value.stringValue) 
         } 
        } 

       } catch { 
        print("Error fetching results for container") 
       } 
      } 

      return results 
     }() 

     self.getFriendsFromPhoneNumbers() 
    }) 
} 

Это проходит через все контейнеры и возвращает массив CNObjects (с только номерами телефонов внутри, но вы можете заставить его получить больше, просто изменив ключи), а затем итерации через каждый контакт и метку внутри массива, чтобы вставить только номера телефонов в виде строк в массив номеров телефонов.

+0

это работает для меня. но что я должен писать для получения firstName и familyName? –

+0

Вы должны использовать больше ключей, таких как: [CNContactGivenNameKey, CNContactFamilyNameKey] –

+0

Я уже сменил ключ, но то, что я должен написать в этом для цикла ///////////////// ////// для маркировкиValue в phone.phoneNumbers { печать (с надписьюValue.value.stringValue) } –

Смежные вопросы