2013-02-13 24 views
1

每當我想新數據添加到現有的Android接觸,我用下面的函數來檢索所有RawContacts標識爲給定的接觸ID:與Android的特殊要求選擇RawContacts

protected ArrayList<Long> getRawContactID(String contact_id) { 
    ArrayList<Long> rawContactIDs = new ArrayList<Long>(); 
    String[] projection = new String[] { ContactsContract.RawContacts._ID }; 
    String where = ContactsContract.RawContacts.CONTACT_ID + " = ?"; 
    String[] selection = new String[] { contact_id }; 
    Cursor c = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, projection, where, selection, null); 
    try { 
     while (c.moveToNext()) { 
      rawContactIDs.add(c.getLong(0)); 
     } 
    } 
    finally { 
     c.close(); 
    } 
    return rawContactIDs; 
} 

之後我只是用插入數據的ContentResolver

getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

這是所有RawContacts標識已完成之前找到。當然,所有數據都會重複添加。因此,我現在只想返回一個結果,但這必須滿足特殊要求。

我想調整我上面的功能,使得其結果符合下列要求:

  1. ContactsContract.RawContactsColumn.DELETED必須爲0
  2. RawContacts項不能是固定一個類似Facebook的
  3. ContactsContract.SyncColumns.ACCOUNT_TYPE最好是「com.google」。所以如果有一個條目符合這個要求,它應該被退回。如果沒有,則返回剩餘的任何條目。

我該怎麼做(最有效率)?我不想讓查詢變得複雜。

+0

爲什麼不在自己的帳戶中使用同步適配器,並將數據放入該帳戶?那應該給你你正在尋找的控制 – 2013-02-16 20:08:51

+0

謝謝!優點是:如果您可以將其添加到Google原始聯繫人,它會自動將所有聯繫人的數據同步到Google聯繫人(通常,如果同步處於打開狀態)。如果我創建了我自己的帳戶和同步適配器,那麼我需要請求幾個額外的權限,而且我必須手動實現一些服務器的同步。 – caw 2013-02-17 01:55:37

回答

1

我已經給了我一些想法,從我的經驗與聯繫r/w,並考慮到您的需求。我希望這可以幫助你解決問題,或者讓你朝着你正在尋找的方向發展。 請注意,我沒有任何設備可用於任何同步適配器,如Facebook,所以不幸我無法確認我的答案生存能力(只讀位可能會改變爲簡單!='')。

相同getRawContactID功能進行一些調整

protected ArrayList<Long> getRawContactID(String contact_id) { 
    HashMap<String,Long> rawContactIDs = new HashMap<String,Long>(); 
    String[] projection = new String[] { ContactsContract.RawContacts._ID, ContactsContract.RawContacts.ACCOUNT_TYPE }; 
    String where = ContactsContract.RawContacts.CONTACT_ID + " = ? AND " + ContactsContract.RawContacts.DELETED + " != 1 AND " + ContactsContract.RawContacts.RAW_CONTACT_IS_READ_ONLY + " != 1" ; 
    String[] selection = new String[] { contact_id }; 
    Cursor c = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, projection, where, selection, null); 
    try { 
     while (c.moveToNext()) { 
      rawContactIDs.put(c.getString(1),c.getLong(0)); 
     } 
    } 
    finally { 
     c.close(); 
    } 
    return getBestRawID(rawContactIDs); 
} 

而另一getBestRawID功能,找到最適合的賬戶 -

protected ArrayList<Long> getBestRawID(Map<String,Long> rawContactIDs) 
{ 
    ArrayList<Long> out = new ArrayList<Long>(); 
    for (String key : rawContactIDs.KeySet()) 
    { 
     if (key.equals("com.google")) 
     { 
      out.clear(); // might be better to seperate handling of this to another function to prevent WW3. 
      out.add(rawContactIDs.get(key)); 
      return out; 
     } else { 
      out.add(rawContactIDs.get(key)); 
     } 
    } 
    return out; 
} 

另外請注意 - 我寫的大部分代碼不運行/測試它。提前道歉。

+0

非常感謝你,一切似乎都很順利:)但我不明白你在第二段代碼中的評論。在那個時候清除那個列表有什麼問題? – caw 2013-02-17 22:04:06

+0

它只是不是非常可擴展或動態的,例如,如果你想改變未來的東西。 – 2013-02-17 22:25:03

+0

好的,終於發現'ContactsContract.RawContacts.RAW_CONTACT_IS_READ_ONLY'已在API級別11中引入。發現應用程序數千用戶崩潰時(我的最低API級別爲8)。不知怎的,Eclipse並沒有提醒我。對於API級別<11或者是否意味着所有原始聯繫人在API級別11之前都是可寫的? – caw 2013-02-19 14:58:28