Android数据库:Litepal getDatabase called recursively

一句话,开子线程处理db操作

好了
流水账记录,碎碎念开始
天地良心,为了使用litepal3.0新增的监听数据库的创建和升级这个功能我费了多少劲
我这边的业务需求是 ,我在一张表里新增了字段,然后更改了数据库版本,想在升级数据库的时候把新增字段的默认值设置为0(litepal的int类型建表时的默认值为null知道吧)
步骤一,首先registerDatabaseListener()方法一定要确保在任何其他数据库操作之前调用,不然根本获取不到事件反馈
步骤二:当数据库升级的时候onUpgrade()方法就会得到回调,你可以把对数据的一些操作放在里面
然而,问题来了,我的天,我搞了一天,一直都是下面这个问题getDatabase called recursively
。。。。
不明觉厉,痛苦的我都去看源码了
后来的时候,我就灵光闪了闪
我开了个子线程处理db操作。。。
尼玛
。。
好了
。。。。
为什么
。。。。。。

一天时间用来干什么不好
难道我白天敲代码不带脑子的嘛>~<

应用Crashjava.lang.RuntimeException: 
Unable to create service com.tiidian.imwaiter.order.service.OrderSyncService: org.litepal.exceptions.LitePalSupportException:
getDatabase called recursively|java.lang.RuntimeException: 
Unable to create service com.tiidian.imwaiter.order.service.OrderSyncService: 
org.litepal.exceptions.LitePalSupportException: getDatabase called recursively
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2568)
at android.app.ActivityThread.access$1800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
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:801)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617)
at dalvik.system.NativeStart.main(Native Method)

Caused by:org.litepal.exceptions.LitePalSupportException: getDatabase called recursively

at org.litepal.crud.LitePalSupport.updateAll(LitePalSupport.java:280)
at com.tiidian.imwaiter.activity.SplashActivity$1.onUpgrade(SplashActivity.java:61)
at org.litepal.tablemanager.LitePalOpenHelper.onUpgrade(LitePalOpenHelper.java:92)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:257)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at org.litepal.tablemanager.Connector.getWritableDatabase(Connector.java:63)
at org.litepal.tablemanager.Connector.getDatabase(Connector.java:75)
at org.litepal.FluentQuery.find(FluentQuery.java:214)
at org.litepal.FluentQuery.find(FluentQuery.java:188)
at com.tiidian.imwaiter.order.db.OrderDBModel.getOrderNotTodayAndSync(OrderDBModel.java:170)
at com.tiidian.imwaiter.order.control.OrderController.getOrderNotTodayAndSync(OrderController.java:157)
at com.tiidian.imwaiter.order.OrderManager.deleteLocalOrderNotTodayAndSynced(OrderManager.java:3601)
at com.tiidian.imwaiter.order.service.OrderSyncService.init(OrderSyncService.java:143)
at com.tiidian.imwaiter.order.service.OrderSyncService.onCreate(OrderSyncService.java:73)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2558)
at android.app.ActivityThread.access$1800(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5001) 
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:801) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617) 
at dalvik.system.NativeStart.main(Native Method) 

Caused by: java.lang.IllegalStateException: getDatabase called recursively

at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at org.litepal.tablemanager.Connector.getWritableDatabase(Connector.java:63)
at org.litepal.tablemanager.Connector.getDatabase(Connector.java:75)
at org.litepal.crud.LitePalSupport.updateAll(LitePalSupport.java:275)
at com.tiidian.imwaiter.activity.SplashActivity$1.onUpgrade(SplashActivity.java:61) 
at org.litepal.tablemanager.LitePalOpenHelper.onUpgrade(LitePalOpenHelper.java:92) 
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:257) 
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
at org.litepal.tablemanager.Connector.getWritableDatabase(Connector.java:63) 
at org.litepal.tablemanager.Connector.getDatabase(Connector.java:75) 
at org.litepal.FluentQuery.find(FluentQuery.java:214) 
at org.litepal.FluentQuery.find(FluentQuery.java:188) 
at com.tiidian.imwaiter.order.db.OrderDBModel.getOrderNotTodayAndSync(OrderDBModel.java:170) 
at com.tiidian.imwaiter.order.control.OrderController.getOrderNotTodayAndSync(OrderController.java:157) 
at com.tiidian.imwaiter.order.OrderManager.deleteLocalOrderNotTodayAndSynced(OrderManager.java:3601) 
at com.tiidian.imwaiter.order.service.OrderSyncService.init(OrderSyncService.java:143) 
at com.tiidian.imwaiter.order.service.OrderSyncService.onCreate(OrderSyncService.java:73) 
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2558) 
at android.app.ActivityThread.access$1800(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5001) 
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:801) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617) 
at dalvik.system.NativeStart.main(Native Method) 

org.litepal.exceptions.LitePalSupportException: getDatabase called recursively


at org.litepal.crud.LitePalSupport.updateAll(LitePalSupport.java:280)
at com.tiidian.imwaiter.activity.SplashActivity$1.onUpgrade(SplashActivity.java:61)
at org.litepal.tablemanager.LitePalOpenHelper.onUpgrade(LitePalOpenHelper.java:92)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:257)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at org.litepal.tablemanager.Connector.getWritableDatabase(Connector.java:63)
at org.litepal.tablemanager.Connector.getDatabase(Connector.java:75)
at org.litepal.FluentQuery.find(FluentQuery.java:214)
at org.litepal.FluentQuery.find(FluentQuery.java:188)
at com.tiidian.imwaiter.order.db.OrderDBModel.getOrderNotTodayAndSync(OrderDBModel.java:170)
at com.tiidian.imwaiter.order.control.OrderController.getOrderNotTodayAndSync(OrderController.java:157)
at com.tiidian.imwaiter.order.OrderManager.deleteLocalOrderNotTodayAndSynced(OrderManager.java:3601)
at com.tiidian.imwaiter.order.service.OrderSyncService.init(OrderSyncServi
        LitePal.registerDatabaseListener(new DatabaseListener() {
            @Override
            public void onCreate() {
                LogManager.get().getLogger(LogManager.class).info("数据库操作:创建数据库");
            }

            @Override
            public void onUpgrade(int oldVersion, int newVersion) {

                ThreadManger.get().add(new ThreadListener() {
                    @Override
                    public void doAction() throws Exception {
                        try{
                            OrderDB orderDB = new OrderDB();
                            orderDB.setToDefault("isClose");
                            int affectedRows = orderDB.updateAll();
                            LogManager.get().getLogger(LogManager.class).info("数据库操作:设置isClose默认值" );
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                });
                LogManager.get().getLogger(LogManager.class).info("数据库操作:版本更新:" + oldVersion + "版本更新到" + newVersion + "版本");
            }
        });
        SQLiteDatabase db = Connector.getDatabase();
发布了72 篇原创文章 · 获赞 28 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/changhuzichangchang/article/details/88424317