- 主要介绍room的基础用法,使用room时数据库升级,重点是数据库加密。
- 定义entity
- 定义dao
- 自定义RoomDatabase实现类
-
场景
- 数据库未加密的情况下,新增其它字段
- 升级数据库步骤 :
- 修改entity
- 创建Migration迁移类
- 修改数据库版本
- 升级数据库步骤 :
- 数据库未加密的情况下,新增其它字段
-
遇到的问题
java.lang.IllegalStateException: Migration didn't properly handle: SimpleInfo(cn.xxx.roomsimple.SimpleInfo).Expected:
已存在的数据库表跟现在的数据库表不同抛出了此问题
- 未正确的按照升级数据库的步骤进行
-
基于android-database-sqlcipher封装的开源库cwac-saferoom
-
android-database-sqlcipher:对数据库整个文件进行加密,打开的时候需要输入密码。
-
结合room的使用
- 使用openHelperFactory方法,配置factory(不推荐)
-
直接调用加密api(推荐方式)
-
具体使用
- 不使用Room.databaseBuilder的openHelperFactory方法配置factory
- 初始化时加密数据库,需要时解密数据库,方案可行;
- 使用Room.databaseBuilder的openHelperFactory方法配置factory,然后再尝试解密数据库(或初始化时先调用数据库加密,然后再尝试解密数据库)
- 出现持续性需要输入密码
- 避免使用该方案
- 只使用Room.databaseBuilder的openHelperFactory方法配置factory,不调用解密的方法
- 弊端:查看数据库需要输入密码,即不能解密数据库
- 不太建议使用该方案
- 不使用Room.databaseBuilder的openHelperFactory方法配置factory
-
修改密码
- 建议方案:先解密,再加密。
android.database.sqlite.SQLiteException: file is not a database: , while compiling: select count(*) from sqlite_master;
at net.sqlcipher.database.SQLiteCompiledSql.native_compile(Native Method)
- 原因(可能是之一):在初始化数据库时未对数据库进行加密,但是在其它地方使用时对数据库进行了加密。
- 在使用模拟器时,未打开root权限,是不可以导出数据库的。在导出文件时,db-shm和db-wal都需要导出来(使用DB Browser for SQLCipher工具查看);