新しいデータを既存の 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 でなければなりません- エントリは、
RawContacts
Facebook のようなセキュリティで保護されたものであってはなりません ContactsContract.SyncColumns.ACCOUNT_TYPE
できれば「com.google」です。したがって、この要件を満たすエントリが 1 つある場合は、それを返す必要があります。何もない場合は、残りのエントリのいずれかを返します。
どうすれば(最も効率的に)これを行うことができますか?クエリを複雑にしたくありません。