出现上述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 轻量...