Android:如何在一个查询中列出属于特定RawContacts帐户的所有数据行

时间:2014-03-25 12:39:12

标签: android android-cursoradapter contactscontract

我正在Android中创建一个联系人应用程序,我正在为特定帐户添加联系人。如何在一个查询中为属于此帐户的所有RawContacts选择所有数据行? 我知道我可以先选择属于该帐户的所有RawContacts然后foreach _ID我可以选择所有数据条目。但首先,这确实很慢,但最重要的是我希望为所有这些数据行获取一个游标,以便我可以将此游标提供给CursorAdapter。

    Cursor rawCursor = context.getContentResolver().query(
    RawContacts.CONTENT_URI,
        new String[] {
            RawContacts.CONTACT_ID,
            RawContacts._ID,
        },
        RawContacts.ACCOUNT_TYPE + " = ?  AND " + RawContacts.ACCOUNT_NAME + " = ? ",
        new String[] {account_type, account_name},
        null);

while (rawCursor.moveToNext()) {
    long rawContactID = rawCursor.getLong(rawCursor.getColumnIndex(RawContacts._ID));
    Cursor dataCursor = mContext.getContentResolver().query(
        Data.CONTENT_URI,
        new String[] {
            Data._ID,
            Data.MIMETYPE,
            Data.IS_SUPER_PRIMARY,
            Data.DATA1,
            Data.DATA2,
            Data.DATA3,
        },
        Data.RAW_CONTACT_ID + " = ?",
        new String[] {String.valueOf(rawContactID)},
        null);
}

1 个答案:

答案 0 :(得分:0)

现在我通过首先查询所有raw_contacts然后在选择中使用IN语句来解决这个问题。像:

ArrayList<String> ids = new ArrayList<String>();
    Cursor idCursor = getRawContactsCursor(context, new String[]{RawContacts._ID}, account_name);
    try {
        while (idCursor.moveToNext()) {
            ids.add(idCursor.getString(idCursor.getColumnIndex(RawContacts._ID)));
        }
    } finally {
        idCursor.close();
    }

    String idSql = "?";
    for (int i = 1; i < ids.size(); i++) {
        idSql += ",?";
    }

    String whereSQL = Data.RAW_CONTACT_ID + " IN (" + idSql + ")";
    String[] whereArgs = null;

    if (!TextUtils.isEmpty(mimetype)) {
        whereSQL += " AND " + Data.MIMETYPE + " = ? ";
        ids.add(mimetype);
    }
    whereArgs = ids.toArray(new String[ids.size()]);

    Cursor cursor = context.getContentResolver().query(
            Data.CONTENT_URI,
            projection,
            whereSQL,
            whereArgs,
            Data.RAW_CONTACT_ID);
    return cursor;

我只是想知道当raw_contacts的数量变得足够大时会发生什么。我猜测有一千个或更多的raw_contact id会破坏内容。