微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐