Skip to content

主要介绍room的基础用法,使用room时数据库升级,重点是数据库加密。

Notifications You must be signed in to change notification settings

MrFishC/RoomSimple

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

前言

  • 主要介绍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,不调用解密的方法
      • 弊端:查看数据库需要输入密码,即不能解密数据库
      • 不太建议使用该方案
  • 修改密码

    • 建议方案:先解密,再加密。

报错

    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工具查看);

参考资料

About

主要介绍room的基础用法,使用room时数据库升级,重点是数据库加密。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages