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);
}