微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复(android.database.CursorWindowAllocationException)崩溃

在Parse中的“本地数据存储”功能可用之前,我曾经拥有自己的本地数据库供离线应用程序使用.我认为一切正常,直到我决定将主屏幕小部件及其应用程序的服务和从该本地数据库提供的列表视图添加到我的应用中.一段时间后,我开始从用户那里得到一些错误(光标分配,#打开的游标),我认为这是一个小问题,可能是由于电话问题等引起的,但后来我自己开始遇到这些问题……我试图解决这些问题以SO中建议的各种可能方式,各种解决方案,尝试关闭指向数据库的所有内容,尝试/捕获内容等,什么都没有.所以几个月后,我放弃了,对自己说,就是使用Parse的Local DataStore,我敢肯定它比我的sqlite实现要好.

大概是一个月前,我以为事情已经解决了,但是今天却出现了这个错误,即使没有使用该应用程序,该错误也会出现.我停止了应用程序和服务,重新启动/关闭了电源,但是当手机解锁时它仍然存在,并且由于今天下午由于该原因无法打开应用程序,因此它是恒定不变的.

我不知道如何解决它,这是4个月的噩梦.希望有所帮助,谢谢.

07-21 19:01:29.360: E/CursorWindow(17106): Could not allocate CursorWindow '/data/data/com.xoaquin.r07d/databases/ParSEOfflinestore' of size 2097152 due to error -12.
07-21 19:01:29.470: E/CursorWindow(17106): Could not allocate CursorWindow '/data/data/com.xoaquin.r07d/databases/ParSEOfflinestore' of size 2097152 due to error -12.
07-21 19:01:29.480: E/AndroidRuntime(17106): FATAL EXCEPTION: main
07-21 19:01:29.480: E/AndroidRuntime(17106): Process: com.xoaquin.r07d, PID: 17106
07-21 19:01:29.480: E/AndroidRuntime(17106): java.lang.RuntimeException: Unable to create application com.xoaquin.r07d.DefaultApplication: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb Failed. # Open Cursors=582 (# cursors opened by this proc=582)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4471)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.app.ActivityThread.access$1500(ActivityThread.java:145)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1266)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.os.Handler.dispatchMessage(Handler.java:102)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.os.Looper.loop(Looper.java:136)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.app.ActivityThread.main(ActivityThread.java:5141)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at java.lang.reflect.Method.invokeNative(Native Method)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at java.lang.reflect.Method.invoke(Method.java:515)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at dalvik.system.NativeStart.main(Native Method)
07-21 19:01:29.480: E/AndroidRuntime(17106): Caused by: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb Failed. # Open Cursors=582 (# cursors opened by this proc=582)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.database.CursorWindow.<init>(CursorWindow.java:104)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.database.AbstractwindowedCursor.clearOrCreateWindow(AbstractwindowedCursor.java:198)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:139)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at android.database.sqlite.sqliteCursor.getCount(sqliteCursor.java:133)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.ParsesqliteDatabase$12.then(ParsesqliteDatabase.java:214)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.ParsesqliteDatabase$12.then(ParsesqliteDatabase.java:205)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task$11.run(Task.java:481)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task.completeAfterTask(Task.java:477)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task.continueWithTask(Task.java:353)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task.continueWithTask(Task.java:364)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task$9.then(Task.java:410)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task$9.then(Task.java:402)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at com.parse.Task$11.run(Task.java:481)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-21 19:01:29.480: E/AndroidRuntime(17106):    at java.lang.Thread.run(Thread.java:841)
07-21 19:01:29.551: E/CursorWindow(17106): Could not allocate CursorWindow '/data/data/com.xoaquin.r07d/databases/ParSEOfflinestore' of size 2097152 due to error -12.
07-21 19:01:38.119: E/WindowManager(674): Starting window AppWindowToken{4312f298 token=Token{42bd2558 ActivityRecord{42538230 u0 com.xoaquin.r07d/.MainActivity t57}}} timed out

以下是我在更改为“解析本地数据存储”之前使用自己的sqlite实现时遇到的错误

java.lang.RuntimeException: Unable to create application com.xoaquin.r07d.DefaultApplication: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb Failed. # Open Cursors=762 (# cursors opened by this proc=762)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4428)
at android.app.ActivityThread.access$1500(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb Failed. # Open Cursors=762 (# cursors opened by this proc=762)
at android.database.CursorWindow.<init>(CursorWindow.java:104)
at android.database.AbstractwindowedCursor.clearOrCreateWindow(AbstractwindowedCursor.java:198)
at android.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:139)
at android.database.sqlite.sqliteCursor.getCount(sqliteCursor.java:133)
at com.parse.ParsesqliteDatabase$12.then(ParsesqliteDatabase.java:214)
at com.parse.ParsesqliteDatabase$12.then(ParsesqliteDatabase.java:205)
at com.parse.Task$11.run(Task.java:481)
at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
at com.parse.Task.completeAfterTask(Task.java:477)
at com.parse.Task.continueWithTask(Task.java:353)
at com.parse.Task.continueWithTask(Task.java:364)
at com.parse.Task$9.then(Task.java:410)
at com.parse.Task$9.then(Task.java:402)
at com.parse.Task$11.run(Task.java:481)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

在我的应用程序类的代码下面,这是我自己的代码中唯一在错误中提到的类(也许那里是错误的):

public class DefaultApplication extends Application{ 


    private static Context context; 

    @Override
    public void onCreate() {
        super.onCreate();

        String manufacturer = Build.MANUFACTURER;
        String brand        = Build.BRAND;
        String product      = Build.PRODUCT;
        String model        = Build.MODEL;

        Parse.enableLocalDatastore(this);
        Parse.initialize(this, "KfBj6ivkLAaYqo", "ePZ6T7RmvGGw3"); 




            PushService.setDefaultPushCallback(this, MainActivity.class);

            ParseFacebookUtils.initialize("75589");

            PushService.subscribe(this, "todos", MainActivity.class);

            ParseUser cu = ParseUser.getCurrentUser(); 
            if(cu!=null){

            String nombretablausuario=cu.getUsername();  

            if(nombretablausuario!=null){

                if (nombretablausuario.contains("\\.")||nombretablausuario.contains("@")){
                          nombretablausuario=nombretablausuario.replaceAll("\\.", "");
                          nombretablausuario=nombretablausuario.replaceAll("@", "");    
                      }
            PushService.subscribe(this, nombretablausuario,MainActivity.class); 

            }

            ParseInstallation installation = ParseInstallation.getCurrentInstallation();
            installation.put("actualuser",cu.getUsername());
            installation.put("manufacturer", manufacturer);
            installation.put("brand", brand);
            installation.put("product", product);
            installation.put("model", model);
            installation.saveEventually();

            }

            String locale = getResources().getConfiguration().locale.getdisplayName();

            if(locale.contains("espa\u00F1ol")){ 

                PushService.subscribe(this, "jalert", JalertActivity.class);
                PushService.unsubscribe(this, "jalerting");
            }else{
                PushService.subscribe(this, "jalerting", JalertActivity.class);
                PushService.unsubscribe(this, "jalert");
            }

             context=getApplicationContext();

    }


    public static Context getCustomAppContext(){ 
      return context;
    }


}

解决方法:

我将回答我自己的问题:看不到解决方案,Parse团队也没有回应.

我现在正在使用SharedPreferences文件来处理本地数据以提供小部件.随着时间的流逝,对Parse Local Datastore的任何使用都会产生光标错误.

希望这有助于从主屏幕小部件和/或服务查询本地sqlite数据库时遇到相同问题的人.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐