2016-12-06 64 views
1

我是Swift 3语言的新手,我想从手机中获取数组中的联系人,然后存储在sqliteDB中。请帮忙。使用Swift 3从手机和商店获取联系人到sqliteDB

我看到了一个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)。我们的要求是,刚刚从所有联系人获得单独的电话号码,并把它变成一个String数组,但你可以很容易地修改此做多:

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

我已经改变了密钥,但我必须写在这个for循环 ///////////////// ////// for phonesValue phone.phoneNumbers { print(labeledValue.value.stringValue) } –