1

ContactsContract API で何かが欠けているように感じます。私のアプリケーションには、Contacts または Groups (ContactsContract API から) への参照を含むいくつかの SQLite テーブルがあります。独自の連絡先とグループ テーブルを使用して車輪を再発明するのではなく、これを行いました。

ただし、クエリを連携させることは悪夢であることが判明しています。特定のグループのすべての連絡先を使用して、SQL テーブルで操作を実行したいとします。ContactsContract にクエリを実行して、グループのメンバーの contact_id を取得し、それらの contact_id を文字列に結合してから、その文字列を別のクエリに入れる必要があります。(または、SQL クエリをループに入れます。)

これは非常に悪いSQLなので、何か間違ったことをしているに違いないと感じていますが、それを行う他の方法への参照を見つけることができません. 私は自分の連絡先リストを維持する寸前です。何か案は?

4

1 に答える 1

3

いいえ、あなたは何か悪いことをしているわけではありません。Contacts ContentProvider (および私が見たほぼすべての ContentProvider) は、従来の SQL の知恵と矛盾しています。

複数のタイプの ContactsContracts.CommonDataKinds からデータを取得する場合は、現在の行の MIME タイプを検出し、それがどの種類のエンティティであるかを判断する必要があります (または、追加のクエリを作成します。私の推奨する解決策は、それはすべて1つのクエリで...)

息を止めてください。これは、そのようなことを行うために私が書いたコードの例です。さまざまな行がさまざまな種類のエンティティである可能性があり、その結果として、それらのジェネリック列がさまざまな種類のデータを保持できることを確認できるはずです。これが、CommonDataKinds.* クラスを使用してそれらをコンテキストで参照する理由です。

public class ContactsHelper {


    private static String[] PROJECTION = {
        Data.CONTACT_ID,
        Data.MIMETYPE,
        StructuredName.GIVEN_NAME,
        StructuredName.FAMILY_NAME,
        StructuredName.DISPLAY_NAME,
        StructuredName.MIDDLE_NAME,
        Email.ADDRESS
    };

    public static void readContacts(Context context) {
        ContentResolver resolver = context.getContentResolver();
        Uri contactsUri = ContactsContract.Data.CONTENT_URI;

        SQLiteDatabase conn = DatabaseHelper.openDatabase(context);

        Cursor cursor = resolver.query(contactsUri, PROJECTION, null, null, null);

        int idxContactId = cursor.getColumnIndex(Data.CONTACT_ID);
        int idxMimeType = cursor.getColumnIndex(Data.MIMETYPE);
        int idxGivenName = cursor.getColumnIndex(StructuredName.GIVEN_NAME);
        int idxFamilyName = cursor.getColumnIndex(StructuredName.FAMILY_NAME);
        int idxDisplayName = cursor.getColumnIndex(StructuredName.DISPLAY_NAME);
        int idxMiddleName = cursor.getColumnIndex(StructuredName.MIDDLE_NAME);
        int idxEmail = cursor.getColumnIndex(Email.ADDRESS);

        for (cursor.moveToFirst(); ! cursor.isAfterLast(); cursor.moveToNext()) {
            String mimeType = cursor.getString(idxMimeType);

            Integer contactId = cursor.getInt(idxContactId);

            if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
                String firstName = cursor.getString(idxGivenName);
                String middleName = cursor.getString(idxMiddleName);
                String lastName = cursor.getString(idxFamilyName);
                String displayName = cursor.getString(idxDisplayName);

                            Log.d(TAG, all the values ^^^);

            }


            if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
                String emailName = cursor.getString(idxEmail);
                Log.d(TAG, all the values ^^^);
            }
        }

        DatabaseHelper.closeDatabase(conn);
        cursor.close();
    }   
}

はい、この完全に深刻な解決策は文字列比較を使用します。もっと良い方法があれば教えてください!

于 2012-06-16T07:25:27.403 に答える