我有一个 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 个单词)。任何人都可以接受它,但我们总是想要更快的速度。
我该怎么办?只是忽略警告,因为它不会导致明显的 Not Acceptable 操作(例如,崩溃、执行缓慢)?或者什么?
编辑
Pztar 建议在查询中使用 LIMIT 50
,但尚不完全清楚如何使用。方法如下——将 LIMIT 50
附加到“order by”列名(对我来说,是 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
您的查询加上 endless list implementation.
将查询更改为 LIMIT 50
这意味着您一次只能获得 50 条记录,然后将其添加到您的 ListView
搭配无尽的 list 。现在,每次您的用户滚动并接近当前列表的末尾时,您都会运行查询以获取下一组 50 条记录并将其附加到您的列表中。
关于java - 应用程序运行良好,那么我可以忽略 "CursorWindow: Window is full: requested allocation 12 bytes, free space 4 bytes, window size 2,097,152 bytes"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37034570/