2013-02-13 23 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