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 然后再去运行应用。竟然没再出错。
总结了下,很可能是因为之前的应用已经有人编译并调试过,所以生成过一次应用目录,但是卸载的时候只是覆盖安装了,因此数据库文件夹的读写权限还是上个应用的,所以此时应该是重新再获取一次文件夹读写权限就可以了。或许完全卸载再重装也是可以解决的,大家可以再做尝试了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。