Android: SQLite 没有 return 所有结果
Android: SQLite do not return all results
我的测试电话中有一百个联系人,并尝试使用以下代码进行搜索:
MatrixCursor cursor = new MatrixCursor(new String[] {"type", "_id", "detail", "optional_data", "lob_data"});
Cursor c;
String selection;
String search = selectionArgs[0].toLowerCase();
try {
selection = "("+ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?) collate nocase";
c = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
new String[]{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.Contacts.PHOTO_URI},
selection,
new String[]{"%"+search+"%"},
null);
c.moveToFirst();
c.moveToNext();
while (!c.isAfterLast()) {
Object[] rowObject = new Object[] {"Contact", c.getString(0), c.getString(1), null, imageToByte(c.getString(2))};
cursor.addRow(rowObject);
c.moveToNext();
}
}
catch (Exception e){
Log.e(TAG, "URI problem with Contacts: "+e);
}
如果我搜索它,不会 return 所有结果。例如,如果我搜索 'and'、[=21,就会出现一个联系人 (Alexander Hall) =]'der' 或 'all' 但是如果我搜索不会出现对于 'ale', 'lex', 'xan' 或 'hal'。如果在任何搜索中字母超过四个,我根本得不到答案,如果有人能向我解释这个逻辑,我会很高兴。
我还要补充一点,我从使用不同排序参数的搜索中得到了不同的结果,不过,如果我进行空搜索,我会得到每个人,所以搜索结果的最大数量似乎不是问题。
任何帮助都会非常有用,谢谢。
你应该尝试为游标创建迭代器
try {
while (cursor.moveToNext()) {
...
}
} finally {
cursor.close();
}
修复后的代码:
MatrixCursor cursor = new MatrixCursor(new String[] {"type", "_id", "detail", "optional_data", "lob_data"});
Cursor c;
String selection;
String search = selectionArgs[0].toLowerCase();
try {
selection = "("+ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?) collate nocase";
c = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
new String[]{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.Contacts.PHOTO_URI},
selection,
new String[]{"%"+search+"%"},
null);
c.moveToFirst();
//c.moveToNext();
while (c.moveToNext()) {
Object[] rowObject = new Object[] {"Contact", c.getString(0), c.getString(1), null, imageToByte(c.getString(2))};
cursor.addRow(rowObject);
//c.moveToNext();
}
}
catch (Exception e){
Log.e(TAG, "URI problem with Contacts: "+e);
}
我的测试电话中有一百个联系人,并尝试使用以下代码进行搜索:
MatrixCursor cursor = new MatrixCursor(new String[] {"type", "_id", "detail", "optional_data", "lob_data"});
Cursor c;
String selection;
String search = selectionArgs[0].toLowerCase();
try {
selection = "("+ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?) collate nocase";
c = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
new String[]{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.Contacts.PHOTO_URI},
selection,
new String[]{"%"+search+"%"},
null);
c.moveToFirst();
c.moveToNext();
while (!c.isAfterLast()) {
Object[] rowObject = new Object[] {"Contact", c.getString(0), c.getString(1), null, imageToByte(c.getString(2))};
cursor.addRow(rowObject);
c.moveToNext();
}
}
catch (Exception e){
Log.e(TAG, "URI problem with Contacts: "+e);
}
如果我搜索它,不会 return 所有结果。例如,如果我搜索 'and'、[=21,就会出现一个联系人 (Alexander Hall) =]'der' 或 'all' 但是如果我搜索不会出现对于 'ale', 'lex', 'xan' 或 'hal'。如果在任何搜索中字母超过四个,我根本得不到答案,如果有人能向我解释这个逻辑,我会很高兴。
我还要补充一点,我从使用不同排序参数的搜索中得到了不同的结果,不过,如果我进行空搜索,我会得到每个人,所以搜索结果的最大数量似乎不是问题。
任何帮助都会非常有用,谢谢。
你应该尝试为游标创建迭代器
try {
while (cursor.moveToNext()) {
...
}
} finally {
cursor.close();
}
MatrixCursor cursor = new MatrixCursor(new String[] {"type", "_id", "detail", "optional_data", "lob_data"});
Cursor c;
String selection;
String search = selectionArgs[0].toLowerCase();
try {
selection = "("+ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?) collate nocase";
c = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
new String[]{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.Contacts.PHOTO_URI},
selection,
new String[]{"%"+search+"%"},
null);
c.moveToFirst();
//c.moveToNext();
while (c.moveToNext()) {
Object[] rowObject = new Object[] {"Contact", c.getString(0), c.getString(1), null, imageToByte(c.getString(2))};
cursor.addRow(rowObject);
//c.moveToNext();
}
}
catch (Exception e){
Log.e(TAG, "URI problem with Contacts: "+e);
}