我正在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);
}
答案 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会破坏内容。