1

每当我想向现有的 Android 联系人添加新数据时,我都会使用以下函数来检索RawContacts给定联系人 ID 的所有 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. ContactsContract.SyncColumns.ACCOUNT_TYPE最好是“com.google”。所以如果有一个条目满足这个要求,它应该被退回。如果没有,则返回任何剩余条目。

我怎样才能做到这一点(最有效)?我不想让查询变得复杂。

4

1 回答 1

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;
}

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

于 2013-02-17T20:29:16.630 回答