现在的位置: 首页 > 综合 > 正文

android中操作SQLite常见错误

2012年10月31日 ⁄ 综合 ⁄ 共 5848字 ⁄ 字号 评论关闭

最近在改应用的一些bug,想起来可以把常见错误整理下,方便自己下次更快速找出错误原因,也给遇到同样问题的同学提供解决思路。我会将错误归类,今天先写一点,以后再增加,欢迎指正。(为了不透漏一些信息,log中包名被修改了)


1.  android.database.sqlite.SQLiteException: unable to close due to unfinalised statements


  1. FATAL EXCEPTION: main  
  2. java.lang.RuntimeException: Unable to start activity ComponentInfo{com.evaluation/com.evaluation.VehicleActivity}: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements  
  3.     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2781)  
  4.     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2797)  
  5.     at android.app.ActivityThread.access$2300(ActivityThread.java:135)  
  6.     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2132)  
  7.     at android.os.Handler.dispatchMessage(Handler.java:99)  
  8.     at android.os.Looper.loop(Looper.java:143)  
  9.     at android.app.ActivityThread.main(ActivityThread.java:4914)  
  10.     at java.lang.reflect.Method.invokeNative(Native Method)  
  11.     at java.lang.reflect.Method.invoke(Method.java:521)  
  12.     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)  
  13.     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)  
  14.     at dalvik.system.NativeStart.main(Native Method)  
  15. Caused by: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements  
  16.     at android.database.sqlite.SQLiteDatabase.dbclose(Native Method)  
  17.     at android.database.sqlite.SQLiteDatabase.onAllReferencesReleased(SQLiteDatabase.java:363)  
  18.     at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)  
  19.     at android.database.sqlite.SQLiteProgram.onAllReferencesReleased(SQLiteProgram.java:116)  
  20.     at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)  
  21.     at android.database.sqlite.SQLiteProgram.close(SQLiteProgram.java:293)  
  22.     at android.database.sqlite.SQLiteQuery.close(SQLiteQuery.java:133)  
  23.     at android.database.sqlite.SQLiteCursor.close(SQLiteCursor.java:532)  
  24.     at com.DatabaseHelper.selectAssessInformation(DatabaseHelper.java:338)  
  25.     at com.JSKApplication.selectAssessInformation(JSKApplication.java:631)  
  26.     at com.VehicleActivity.onCreate(VehicleActivity.java:548)  
  27.     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1065)  
  28.     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2745)  
  29.     ... 11 more  

这个错误翻译过来就是:不能关闭数据库由于未完成的语句。

我从网上查了一下,最可能的原因是:你在操作sqlite数据库时使用多线程了,但sqlite数据库是不支持多线程操作,所以你必须实现多线程同步的机制。

我的程序出错是因为:在后台启动了个service定时向服务器请求数据,并在线程中将数据插入数据库。在某个时间段,用户在向数据库插入数据后,关闭数据库,而此时线程正在向数据库中写入数据,就会造成上述异常。


2.android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed


  1. 07-04 16:18:56.677: W/System.err(29830): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed  

约束失败,导致这类错误,原因一般有两个:

1)插入的数据有一个是主键,而且插入的主键相同;

2)插入的数据有一条数据为空,而数据库中定义不能为空,也会导致这样的错误;

最近在改应用的一些bug,想起来可以把常见错误整理下,方便自己下次更快速找出错误原因,也给遇到同样问题的同学提供解决思路。我会将错误归类,今天先写一点,以后再增加,欢迎指正。(为了不透漏一些信息,log中包名被修改了)


1.  android.database.sqlite.SQLiteException: unable to close due to unfinalised statements


  1. FATAL EXCEPTION: main  
  2. java.lang.RuntimeException: Unable to start activity ComponentInfo{com.evaluation/com.evaluation.VehicleActivity}: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements  
  3.     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2781)  
  4.     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2797)  
  5.     at android.app.ActivityThread.access$2300(ActivityThread.java:135)  
  6.     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2132)  
  7.     at android.os.Handler.dispatchMessage(Handler.java:99)  
  8.     at android.os.Looper.loop(Looper.java:143)  
  9.     at android.app.ActivityThread.main(ActivityThread.java:4914)  
  10.     at java.lang.reflect.Method.invokeNative(Native Method)  
  11.     at java.lang.reflect.Method.invoke(Method.java:521)  
  12.     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)  
  13.     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)  
  14.     at dalvik.system.NativeStart.main(Native Method)  
  15. Caused by: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements  
  16.     at android.database.sqlite.SQLiteDatabase.dbclose(Native Method)  
  17.     at android.database.sqlite.SQLiteDatabase.onAllReferencesReleased(SQLiteDatabase.java:363)  
  18.     at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)  
  19.     at android.database.sqlite.SQLiteProgram.onAllReferencesReleased(SQLiteProgram.java:116)  
  20.     at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)  
  21.     at android.database.sqlite.SQLiteProgram.close(SQLiteProgram.java:293)  
  22.     at android.database.sqlite.SQLiteQuery.close(SQLiteQuery.java:133)  
  23.     at android.database.sqlite.SQLiteCursor.close(SQLiteCursor.java:532)  
  24.     at com.DatabaseHelper.selectAssessInformation(DatabaseHelper.java:338)  
  25.     at com.JSKApplication.selectAssessInformation(JSKApplication.java:631)  
  26.     at com.VehicleActivity.onCreate(VehicleActivity.java:548)  
  27.     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1065)  
  28.     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2745)  
  29.     ... 11 more  

这个错误翻译过来就是:不能关闭数据库由于未完成的语句。

我从网上查了一下,最可能的原因是:你在操作sqlite数据库时使用多线程了,但sqlite数据库是不支持多线程操作,所以你必须实现多线程同步的机制。

我的程序出错是因为:在后台启动了个service定时向服务器请求数据,并在线程中将数据插入数据库。在某个时间段,用户在向数据库插入数据后,关闭数据库,而此时线程正在向数据库中写入数据,就会造成上述异常。


2.android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed


  1. 07-04 16:18:56.677: W/System.err(29830): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed  

约束失败,导致这类错误,原因一般有两个:

1)插入的数据有一个是主键,而且插入的主键相同;

2)插入的数据有一条数据为空,而数据库中定义不能为空,也会导致这样的错误;

抱歉!评论已关闭.