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的對象,加密密鑰是一樣的也是不能操作的,要么合並這些類,要么把數據庫分開
