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 つの結果のみを返したいのですが、これは特別な要件を満たす必要があります。

上記の関数を調整して、結果が次の要件を満たすようにしたいと思います。

  1. ContactsContract.RawContactsColumn.DELETED0 でなければなりません
  2. エントリは、RawContactsFacebook のようなセキュリティで保護されたものであってはなりません
  3. ContactsContract.SyncColumns.ACCOUNT_TYPEできれば「com.google」です。したがって、この要件を満たすエントリが 1 つある場合は、それを返す必要があります。何もない場合は、残りのエントリのいずれかを返します。

どうすれば(最も効率的に)これを行うことができますか?クエリを複雑にしたくありません。

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 に答える