正确使用sqlcipher for Android

时间:2021-11-13 17:57:53

 android-database-sqlcipher是基于SQLCipher的数据库加密框架,支持android4到android9,经常用来对android的SqlLite进行加密,现在支持Gradle集成,如果要支持androidx,可以使用Room框架,也可以配合原声的SQLiteOpenHelper使用。

首先在你的build.gradle中添加依赖:

implementation ‘net.zetetic:android-database-sqlcipher:4.2.0‘  
如果要兼容androidx请参考github页的配合Room框架使用的方案。

这里介绍怎么和原生API配合使用:

1、将所有android.database.sqlite.*的引入全部更改为net.sqlcipher.database.*,例如android.database.sqlite.SQLiteDatabase改为 net.sqlcipher.database.SQLiteDatabase;

2、在你的application的oncreate方法里面调用SQLiteDatabase.loadLibs();传入application的上下文作为参数;

3、在你获取数据库对象的时候,使用SQLiteDatabase.g() ,传入密码,支持String,byte[],char[] 作为密码;

这里有一个guide页作为使用简介https://www.zetetic.net/sqlcipher/sqlcipher-for-android/

 

下面说一说使用过程中可能出现的问题

  •  SQLiteDatabase mSQLiteDatabase = helper.getWritableDatabase(GlobalConst.DB_PASSWORD);  

虽然guide页是在onCreate里创建的数据库对象,但是实测执行这段代码耗时非常严重,通常情况下为0.8s-1.5s左右,不像使用原生的速度很快不会卡顿,因此建议维系一个全局的单例句柄,可以在应用启动加载页异步加载数据库对象设置为Application全局变量使用或者在每次需要获取db对象的时候都使用异步操作,如果你使用单例模式,要保证每次同时操作数据库的db对象不再同一个线程,因此全部数据操作建议都用异步操作。

  • 密码是对的但是打不开数据,如果你有使用多个类似个继承自DBHelper的对象,加密密钥是一样的也是不能操作的,要么合并这些类,要么把数据库分开