在Android中选择具有特殊要求的RawContacts

时间:2013-02-13 02:35:02

标签: android android-contacts android-contentresolver

每当我想向现有Android联系人添加新数据时,我都会使用以下函数检索给定联系人ID的所有RawContacts ID:

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个ID完成的。当然,效果是重复添加所有数据。因此,我现在只想返回一个结果,但这必须满足特殊要求。

我想调整上面的功能,使其结果符合以下要求:

  1. ContactsContract.RawContactsColumn.DELETED必须为0
  2. RawContacts条目不得像Facebook的
  3. 那样安全
  4. ContactsContract.SyncColumns.ACCOUNT_TYPE最好是“com.google”。因此,如果有一个条目满足此要求,则应返回该条目。如果没有,则返回任何剩余的条目。
  5. 我怎样才能(效率最高)?我不想让查询变得复杂。

1 个答案:

答案 0 :(得分:1)

根据我对联系人的经验,以及您的需求,我已经考虑过这一点。我希望这可以帮助您解决问题,或者指出您正在寻找的方向。 请注意,我没有任何设备可用任何同步适配器,如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;
}

还要注意 - 我编写了大部分代码而没有运行/测试它。提前道歉。