Android SQLite游标WindowAllocationException崩溃

Android SQLite游标WindowAllocationException崩溃,android,cursor,Android,Cursor,当我发出大量cursor.moveToNext请求时,我的程序会崩溃。错误消息如下: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=773 (# cursors opened by this proc=773) at android.database.CursorWindow.<init>(CursorWindow

当我发出大量cursor.moveToNext请求时,我的程序会崩溃。错误消息如下:

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=773 (# cursors opened by this proc=773)
at android.database.CursorWindow.<init>(CursorWindow.java:112)
at android.database.CursorWindow.<init>(CursorWindow.java:100)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.clearOrCreateWindow(SQLiteCursor.java:364)
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.moveToNext(AbstractCursor.java:209)
at net.cunniman.teacherplannerlite.SchoolClassDataSource.getClassForDayView(SchoolClassDataSource.java:173)
at net.cunniman.teacherplannerlite.DayView.getSchoolClasses(DayView.java:200)
at net.cunniman.teacherplannerlite.DayView.displayDate(DayView.java:176)
at net.cunniman.teacherplannerlite.DayView.plusDay(DayView.java:287)
at net.cunniman.teacherplannerlite.DayView.onClick(DayView.java:93)
at android.view.View.performClick(View.java:3565)
at android.view.View$PerformClick.run(View.java:14165)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4514)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
at dalvik.system.NativeStart.main(Native Method)

try {
this.openForRead();
for (int day_counter = 0; day_counter < DAY_PERIOD.length/2; day_counter++)
{

    Cursor cursor = database.rawQuery
        ("SELECT " + NAME + " FROM " + TABLE_NAME + " WHERE " + DAY_PERIOD[day_counter * 2]
        + " = '" + day + "' AND " + DAY_PERIOD[day_counter * 2 + 1] + " = "
        + Integer.toString(period), null);


while (cursor.moveToNext())
{
    String name = cursor.getString(0);
    sc.setName(name);
}


} finally {
    this.close();
}
有人知道这可能是什么原因吗?可能是内存泄漏?但是有什么方法可以阻止它发生吗


非常感谢,导致此错误的原因通常是非闭合游标。确保在使用完所有游标后关闭它们,即使在出现错误的情况下也是如此

Cursor cursor = null;
try {
    cursor = db.query(...
    // do some work with the cursor here. i.e.:
    while (cursor.moveToNext())
    { .... }
} finally {
    // this gets called even if there is an exception somewhere above
    if(cursor != null)
        cursor.close();
}

您可能没有关闭所有游标或您没有关闭所有游标。在while循环之后,添加cursor.close。您还可以创建许多光标对象。我建议您检查代码。最好做一个更大的SQL,获取所有数据,然后在上面循环。谢谢Tom,这对这两方面都很有帮助,而且很有意义。明天我将尝试实现。我在模拟器上遇到了类似的问题,但在我测试过的任何设备上都没有。但是,我正在关闭所有游标。有什么想法吗?我在模拟器上遇到了类似的问题,但在我测试过的任何设备上都没有。但是,我正在关闭所有游标。有什么想法吗?对不起,没有任何具体细节我帮不了你。最好换一个新的问题。是的,我有一种感觉。在我的例子中,这是一个相当复杂的问题,所以我将首先重写所有代码,看看这是否有帮助。