sqlite3_open_v2("/data/data/com.xxx.xxx/databases/xxx.db", &handle, 6, NULL) failed

         最近做的一个项目需要适配android 2.3.3平台,在项目导入阶段遇到一个数据库的问题,在此记录下问点log和初步解决方案。

        看log

                I/Database( 1135): sqlite returned: error code = 14, msg = cannot open file at source line 25467
                E/Database( 1135): sqlite3_open_v2("/data/data/com.xxx.bluetooth/databases/bt_contact.db", &handle, 6, NULL) failed
               D/AndroidRuntime( 1135): Shutting down VM
               W/dalvikvm( 1135): threadid=1: thread exiting with uncaught exception (group=0x40139560)
               E/AndroidRuntime( 1135): FATAL EXCEPTION: main
               E/AndroidRuntime( 1135): android.database.sqlite.SQLiteException: unable to open database file
               E/AndroidRuntime( 1135):        at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
               E/AndroidRuntime( 1135):        at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
               E/AndroidRuntime( 1135):        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
               E/AndroidRuntime( 1135):        at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
               E/AndroidRuntime( 1135):        at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
               E/AndroidRuntime( 1135):        at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:554)
               E/AndroidRuntime( 1135):        at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
               E/AndroidRuntime( 1135):        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
               E/AndroidRuntime( 1135):        at com.xxx.bluetooth.ContactProvider.query(ContactProvider.java:447)
               E/AndroidRuntime( 1135):        at android.content.ContentProvider$Transport.query(ContentProvider.java:187)
               E/AndroidRuntime( 1135):        at android.content.ContentResolver.query(ContentResolver.java:262)
               E/AndroidRuntime( 1135):        at com.xxx.bluetooth.BlueToothService.setManagerAddrList(BlueToothService.java:999)
               E/AndroidRuntime( 1135):        at com.xxx.bluetooth.BlueToothService$1.handleMessage(BlueToothService.java:276)
               E/AndroidRuntime( 1135):        at android.os.Handler.dispatchMessage(Handler.java:99)
               E/AndroidRuntime( 1135):        at android.os.Looper.loop(Looper.java:130)
               E/AndroidRuntime( 1135):        at android.app.ActivityThread.main(ActivityThread.java:3683)
               E/AndroidRuntime( 1135):        at java.lang.reflect.Method.invokeNative(Native Method)
               E/AndroidRuntime( 1135):        at java.lang.reflect.Method.invoke(Method.java:507)
               E/AndroidRuntime( 1135):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
               E/AndroidRuntime( 1135):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
               E/AndroidRuntime( 1135):        at dalvik.system.NativeStart.main(Native Method)


            通过log内容最后锁定的代码部分是

                 SQLiteDatabase db = mOpenHelper.getWritableDatabase();

            可以肯定的是数据库文件的打开出了问题,因此网上看了一圈,发现很多人都遇到了,不过很多都是不了了之了。

            但是也还是有收获的,那就是起码可以初步确认是数据库读写的权限应该是有缺失导致的,于是各种尝试。

   <uses-permissioandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
   <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

       检查了一遍,都已经加过了。所以排除这个地方的读写权限。

       然后命令行到终端去看/data/data/com.xxx.bluetooth/databases/bt_contact.db,结果发现数据库文件是存在的,那就奇怪了,为什么会不能操作打开呢。于是试了下给databases文件夹权限。chmod 777 /databases 然后再去运行应用。竟然没再出错。

       总结了下,很可能是因为之前的应用已经有人编译并调试过,所以生成过一次应用目录,但是卸载的时候只是覆盖安装了,因此数据库文件夹的读写权限还是上个应用的,所以此时应该是重新再获取一次文件夹读写权限就可以了。或许完全卸载再重装也是可以解决的,大家可以再做尝试了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。