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 然后再去运行应用。竟然没再出错。

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

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能