15

我在我的 android 应用程序中运行SQLite3数据库。我刚刚从具有 200k 行和 14 列的预填充数据库中读取。条目是单词。所有列的数据类型都是文本。查询最多 11 个字母的单词(例如 ABANDONMENT)可以正常工作。但是对于 12 或更大(例如 ABANDONMENTS),应用程序崩溃。这是日志猫:

Could not allocate CursorWindow '//data//data//com.example.myapp//databases//database.sqlite' of size 2097152 due to error -12.
threadid=11: thread exiting with uncaught exception (group=0x40adf9f0)
FATAL EXCEPTION: Thread-2883
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=861 (# cursors opened by this proc=861)
at android.database.CursorWindow.<init>(CursorWindow.java:104)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201)
at com.example.myapp.MainActivity.query(MainActivity.java:815)
at com.example.myapp.MainActivity$2.run(MainActivity.java:356)
at java.lang.Thread.run(Thread.java:856)

代码:

query = "select * from words where col_1 = \"" + (myWord)+ "\";";
cursor = database.rawQuery(query, null);
if (cursor != null)                                          
    cursor.moveToFirst(); // line 815
if (!cursor.isAfterLast()) {
    do {
        for (i = 1; i < cursor.getColumnCount(); i++) {
            temp = cursor.getString(i);
            //other stuff
        }
    } while (cursor.moveToNext());
    cursor.close();
}

那么错误是什么意思,为什么应用程序崩溃了?

4

3 回答 3

21

错误 -12 表示游标泄漏。

尝试关闭它:

try {....} finally {  cursor.close();}
于 2014-01-14T08:17:37.717 回答
13

我在一个循环中查询。并且在循环内部而不是外部关闭光标解决了这个问题。

于 2013-08-05T14:56:26.067 回答
6

Android 游标将所有查询结果读取到内存中,并且该数据的限制为 1 MB。

选择此限制是因为此数据量可能会使您的应用程序在移动设备上运行缓慢。

如果可能,您应该:

  • 不在您的代码中而是在 SQL 中进行计算;
  • 仅查询您需要的数据(即,不使用SELECT *但只获取您需要的列,并使用WHERE过滤器);
  • 读取较小部分的数据。
于 2013-07-06T08:33:07.937 回答