出现上述Bug,需要你DeBug调试db = dbHelp.getWritableDatabase(p);进入SQLite内部方法,如果返回的是db=null,Sucess=false,那么请添加数据的读写权限再试一次。
如果出现大面积:Attempt to invoke virtual method 'void net.sqlcipher.database.SQLiteDatabase.beginTransaction()' on a null object reference.
或者:
java.lang.NullPointerException: Attempt to invoke virtual method 'void net.sqlcipher.database.SQLiteDatabase.endTransaction()' on a null object reference。
在保证SQLite代码处理正确的情况下,那么也需要你添加存储的读写权限试试,因为安卓版本问题,6.0以上需要添加动态权限请求(Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE)。
老版本只需要在清单文件加上读写权限即可。
导致需要权限的原因:
SQLite数据库默认的存储路径是/data/data/包名/databases下面,默认情况下手机不需要添加动态权限滴,但是如果你是自定义数据库的存储路径,那么就需要请求对内存的读写权限。
SQLite自定义路径的方法:SQLiteOpenHelper继承的类里面,
private ElinkDBHelper(Context context, String loginID) {
super(context, Environment.getExternalStorageDirectory().getAbsolutePath()+"/elink/android/db/"+"PersonDB_" + loginID +".db", null, DATABASE_VERSION);
//super(context, "PersonDB_" + loginID, null, DATABASE_VERSION);
}
eg1:super(context, Environment.getExternalStorageDirectory().getAbsolutePath()+"/elink/android/db/"+"PersonDB_" + loginID +".db", null, DATABASE_VERSION);
eg2:super(context, "PersonDB_" + loginID, null, DATABASE_VERSION);
区别就是传递name参数的时候,在数据名前面添加指定的路径就行,数据库名用xxx.db结束。
net.sqlcipher.database.SQLiteException: error code 14: Could not open database
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- Crash: android.database.sqlite.SQLiteOutOfMemoryException...
- 一.四大组件: Android四大组件分别为activity、service、content provider、b...
- 今天在将一个本地PHP网站部署到服务器后,访问某页面时发生如下错误: Fatal error: Uncaught...
- 1 Android四种数据持久化方式 Android有四种数据持久化方式: SharePreference 轻量...