应用程序运行正常,所以我可以忽略"CursorWindow: Window is full: requested allocation 12 bytes, free space 4 bytes, wi



我有一个 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 条记录并将其追加到列表中。

相关内容

最新更新