ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-12 04:27:21  阅读:410  来源: 互联网

标签:parse-platform android sqlite


在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数据库时遇到相同问题的人.

标签:parse-platform,android,sqlite
来源: https://codeday.me/bug/20191012/1897692.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有