android - 什么可能导致此 SQLite CursorWindowAllocationException?

标签 android sqlite android-activity android-sqlite

我的 Google Play 开发控制台向我报告了我的 Android 应用程序第一次崩溃。看起来 SQLite 无法为游标分配内存,但我以前从未见过,也无法重现。有任何想法吗?

Google 报告的 Stackgrace:

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 函数的地方。此时在 Activity 中,数据库已成功打开、查询和关闭。

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

最佳答案

这实际上是一个 OutOfMemoryError。引用 the comments for that exception class :

This exception is thrown when a CursorWindow couldn't be allocated, most probably due to memory not being available.

错误消息显示您有 530 个打开的 Cursor 对象,这可能是您问题的一部分。例如,您在 getCourse() 方法中泄漏了一个 Cursor。确保在完成后立即关闭 Cursor

如果这没有帮助,您需要将其视为 OutOfMemoryError 并确定您在其他什么地方浪费了堆空间,也许通过 using tools like MAT .

关于android - 什么可能导致此 SQLite CursorWindowAllocationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196905/

相关文章:

java - 在 onCreate 中开始新 Activity 仅适用于延迟

android - 改造 - 如何在异步请求中发出同步请求

android - adb 安装失败并显示消息 Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE] 即使在重新启动系统和模拟器之后也是如此

sqlite - Core Data sqlite存储单表由于继承弊端?

c++ - Sqlite C++ 插入很慢

android - 查找哪个应用程序启动了我的 Activity

android - 从 Activity 更新 Android 小部件

安卓 Espresso : ViewPager does not have adapter instance

Android 位图、回收和堆 fragment

ios - 核心数据似乎获取了空对象