我有一个 176,000 字的 SQLite 数据库和一个搜索它的应用程序(通过 IntentService
(并且运行良好,永远不会崩溃。即使返回了数千个"点击",用户也可以快速无缝地滚动列表。但我经常可能总是收到标题中显示的 Logcat 警告消息。
我使用Cursor
来访问数据库数据,并使用ScrollView
中的TextView
,如下所示:
<ScrollView
...>
<TextView
android:id= "@+id/txaMatches"
android:scrollbars= "vertical"
.../>
</ScrollView>
法典:
// initialize, etc.
Cursor cursor = mdatabase.query(TABLE_NAME, mColumns, whereClause,
wildCardReplacements, null, null, WORD_COLUMN_NAME);
nRows = cursor.getCount();
while (n <= prefMaxMatches && i < nRows) {
cursor.moveToPosition(i);
// do stuff
}
但是警告让我想知道更改代码以摆脱它是否会提高响应能力。有些搜索需要一段时间(即,输出不是立即的,而是在合理的时间段内给出的(,具体取决于输入的Pattern
(例如,*
必须搜索所有 176,000 个单词(。任何人都可以忍受它,但我们总是想要更快的速度。
我该怎么办?只是忽略警告,因为它不会导致明显的不可接受的操作(例如,崩溃,执行缓慢(?还是什么?
编辑
Pztar建议在查询中使用LIMIT 50
,但并不完全清楚如何做到这一点。以下是方法--将LIMIT 50
附加到"排序依据"列名称(对我来说,这是WORD_COLUMN_NAME
(:
String __whereClause = "word like ?";
String[] __wildCardReplacements = {pattern};
cursor = mdatabase.query(TABLE_NAME, mColumns, __whereClause,
__wildCardReplacements, null, null,
WORD_COLUMN_NAME + " LIMIT 50");
--或者,正如cricket_007,--所建议的那样
使用具有更多参数的调用query
版本:
cursor = mdatabase.query(TABLE_NAME, mColumns, __whereClause,
__wildCardReplacements, null, null,
WORD_COLUMN_NAME, "50");
该应用程序可以在您的特定设备或任何当前设备上正常运行,但您无法保证它将在较旧的设备上运行。 你绝对不应该忽视这一点。你看到的警告是请求更多内存,在较弱的设备上,这可能会导致垃圾回收运行,随后导致应用中出现意外结果。
根据您的帖子,查询可以没有模式,从而导致加载所有记录。ListView
只能显示x
数量的记录(取决于设备高度( 假设这个数字是5
您一次只能在屏幕上看到5
记录176k
列表。但是,您永远不会一次看到所有这些记录,那么为什么要一次加载所有这些记录呢?我的建议是LIMIT
您的查询以及无休止的列表实现。
将您的查询更改为LIMIT 50
意味着您一次只能获得 50 条记录,然后将其添加到您的ListView
与无尽列表配对。现在,每次用户滚动并接近当前列表的末尾时,您都会运行查询以获取下一组 50 条记录并将其追加到列表中。