net.sqlcipher.database.SQLiteExc

2023-03-06  本文已影响0人  迷失在你de流年

出现上述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结束。

上一篇 下一篇

猜你喜欢

热点阅读