Intereting Posts
Почему для Samsung Galaxy TAB 7.0 не работает иерархический просмотрщик? Настройка libGDX позволяет мне использовать Java 8, которая сбой в Android SurfaceHolder.lockCanvas () Возвращает null Даже несмотря на то, что он был доступен Диалоговое окно «Выбор цвета» Название расширенной деятельности не отображается с пользовательским стилем Override поддерживает Rtl в одном из макетов Невозможно вставить в Редактируемый Как я могу наложить один аудиофайл на другой и сохранить его? Проблема с функциями ожидания ожидания в библиотеке Volley (PriorityBlockingQueue.java) Тестирование блоков Android для отказа от типа сборки Debug Звук HTML5 не воспроизводится несколько раз в устройстве Android 4.0.4 Собственный браузер Android maps V2 newLatLngBounds с подшипником Изогнутая прямоугольная форма андроида Эмулятор Android: как я могу получить список запущенных сервисов Android – копирование существующего проекта с новым именем

Что может быть причиной этого SQLite CursorWindowAllocationException?

Моя консоль Google Play сообщила о моем первом сбое для моего приложения для Android. Похоже, SQLite не смог выделить память курсору, но я никогда не видел этого раньше и не могу воспроизвести его. Есть идеи?

Stackgrace, сообщаемая Google:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.NsouthProductions.gradetrackerpro/com.NsouthProductions.gradetrackerpro.Activity_Category}: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=530 (# cursors opened by this proc=530) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) at android.app.ActivityThread.access$900(ActivityThread.java:161) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:157) at android.app.ActivityThread.main(ActivityThread.java:5356) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) at dalvik.system.NativeStart.main(Native Method) Caused by: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=530 (# cursors opened by this proc=530) at android.database.CursorWindow.<init>(CursorWindow.java:108) at android.database.CursorWindow.<init>(CursorWindow.java:100) at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198) at android.database.sqlite.SQLiteCursor.clearOrCreateWindow(SQLiteCursor.java:301) at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139) at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197) at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237) at com.NsouthProductions.gradetrackerpro.DBAdapter.getCourse(DBAdapter.java:401) at com.NsouthProductions.gradetrackerpro.Activity_Category$CategoryActivityFragment.setListData(Activity_Category.java:196) at com.NsouthProductions.gradetrackerpro.Activity_Category$CategoryActivityFragment.onCreateView(Activity_Category.java:182) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1189) at android.app.Activity.performStart(Activity.java:5436) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) ... 11 more 

Где это не удалось в моем классе DBAdapter.

 public Course getCourse (int rowId) throws SQLException { Cursor c = db.query(true, TABLE_COURSES, new String[] {KEY_ID, KEY_TITLE, KEY_YEAR, KEY_SEASON, KEY_CREDIT}, KEY_ID + "=" + rowId, null, null, null, null, null); if (c != null) { c.moveToFirst(); } Course course = new Course(c.getInt(0), c.getString(1), c.getInt(2), c.getString(3), c.getDouble(4)); return course; } 

Где вызывается функция DBAdapter. На этом этапе операции db уже был открыт, запрошен и успешно закрыт.

 public void setListData(){ db.open(); Grade[] g = db.getGradesInCategory(catId); this.getActivity().setTitle(db.getCourse(courseId).getTitle()); db.close(); 

Solutions Collecting From Web of "Что может быть причиной этого SQLite CursorWindowAllocationException?"

OutOfMemoryError это OutOfMemoryError . Цитирование комментариев для этого класса исключений :

Это исключение выдается, когда CursorWindow не может быть выделен, скорее всего из-за недоступности памяти.

Сообщение об ошибке показывает, что у вас есть 530 открытых объектов Cursor , которые могут быть частью вашей проблемы. Например, вы протекаете Cursor в getCourse() . Убедитесь, что вы закрыли Cursor как только закончите с ним.

Если это не поможет, вам нужно будет обработать это как OutOfMemoryError и определить, где еще вы тратите кучу пространства, возможно, используя такие инструменты, как MAT .

Курсоры должны быть закрыты:

 Cursor c = db.query(...); try { ... } finally { c.close(); } 

Если вы не хотите связываться с несколькими локальными переменными для возврата, вы можете вернуть объект Cursor, а затем закрыть его из вызывающего метода.

Это происходит в ответ на «Хм .. Иногда я использую return cursor.getString (0). Думаю, я не могу закрыть курсор после возврата и не возвращать его после закрытия. Мне придется возвращать временные переменные, правильно ? – NSouth 4 октября '14 в 20:44:

@NSouth: «Мне нужно будет возвращать переменные temp, не так ли?» – если вы имеете в виду локальные переменные (материал, объявленный в теле метода), то да. – CommonsWare Oct 4 '14 в 20:46

Я знаю, что это скорее комментарий, чем ответ, но у меня нет комментариев о репутации, и я подумал, что это может быть полезно.