当前位置: 代码迷 >> 综合 >> NO.3 GreenDao(加密问题)
  详细解决方案

NO.3 GreenDao(加密问题)

热度:99   发布时间:2023-12-15 16:26:40.0

零蚀
[? greendao 官方文档]


  • step 1 依赖

    // project 
    ext {greendao_version='3.2.2'
    }
    classpath "org.greenrobot:greendao-gradle-plugin:${greendao_version}"
    // module
    api/implementation "org.greenrobot:greendao:${greendao_version}"
    api/implementation "org.greenrobot:greendao-generator:${greendao_version}"
    

    顶部声明

    apply plugin: 'org.greenrobot.greendao'
    

    指定greendao的生成包的路径

    android{greendao {schemaVersion 1daoPackage 'ash.com.greendao_202043.greendao'//这个是生成代码保存的包名targetGenDir 'src/main/java'//保存到java代码路径}}
    

  • step 2 构建bean类

    注解 含义
    @Entity 用于标识这是一个需要Greendao帮我们生成代码的bean
    @Id 标明主键,括号里可以指定是否自增
    @Property 用于设置属性在数据库中的列名(默认不写就是保持一致)
    @NotNull 非空
    @Transient 标识这个字段是自定义的不会创建到数据库表里
    @Unique 添加唯一约束
    @ToOne 将自己的一个属性与另一个表建立关联(外键)
    @ToMany referencedJoinProperty,类似于外键约束
    @JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性
    @Entity
    public class TestBean {
          @Idprivate Long id;@NotNullprivate String Text;
    }
    

    ?? Build -> make project 生成greendao对应的代码。
    Greendao在bean代码生成方面不支持kotlin,不支持kotlin,不支持kotlin


  • step 3 构建数据库

    application

    open class BaseApplication : Application() , CameraXConfig.Provider {
          private lateinit var  daoSession:DaoSession.....override fun onCreate() {
          super.onCreate()INSTANCE=this// greenDaoval helper = DaoMaster.DevOpenHelper(this, "new_db")val db = helper.writableDbdaoSession = DaoMaster(db).newSession()}fun getDaoSession():DaoSession{
          return daoSession}}
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n98CeNbk-1585989093279)(media/15859143478891/15859797960388.jpg)]

    object GreenDaoBaseUtil {
          private val session = (BaseApplication.INSTANCE as BaseApplication).getDaoSession()fun <T> insert(t: T) {
          session.insert(t)}fun <T> delete(t: T) {
          session.delete(t)}fun <T> deleteAll(t: Class<T>) {
          session.deleteAll(t)}fun <T> update(t: T) {
          session.update(t)}fun <T, K> selectItem(t: Class<T>, where: String, vararg selectionArg: String) : List<T>{
          return session.queryRaw<T, K>(t, where, *selectionArg)}fun <T> selectBySql(t:Class<T>,mySql:String="",selectAll:Boolean=true):List<T>{
          return if(selectAll){
          session.queryBuilder<T>(t).build().list()}else{
          session.queryBuilder<T>(t).where(WhereCondition.StringCondition(mySql)).build().list()}}fun <T, K> selectAll(t: Class<T>): List<T> {
          val list = session.loadAll<T, K>(t)//TODO list 对返回的多有item数据列表进行操作return list}fun clear() {
          session.clear()}
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5QlrwsA-1585989093280)(media/15859143478891/15859799974275.jpg)]


  • step 4 数据库加密

    官网上有很多如何使用greenDao加密的文章关于,就是改动一行代码,或者再加个依赖
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UO0GjH0g-1585989093280)(media/15859143478891/15859873938155.jpg)]

    implementation 'net.zetetic:android-database-sqlcipher:4.3.0'
    

    但是运用时候经常会爆出以下错误,或者是导入了sqlcipher后还是无法找到DataBase,而且问题网上没有给出明确的回答,其实解决问题的方法很简单,但是我先卖个关子。谈谈我的理解&解决之路。

    java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/sqlite/db/SupportSQLiteDatabase;
    or
    Caused by: java.lang.ClassNotFoundException: Didn't find class "net.sqlcipher.database.SQLiteOpenHelper" 
    

    首先看了一下外网有么有生路,结果是连大佬们都很纠结,但是有趣的是官方直接close了,然后我看了一下greendao的github的提交记录,并没有提交修复这个问题,所以真相是: 这根本不算个问题 。(greendao可能觉得这么菜的问题所以拒绝回答,臆想中…)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdDXK3su-1585989093280)(media/15859143478891/15859878523536.jpg)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jOOqtWuy-1585989093280)(media/15859143478891/15859878918630.jpg)]

    所以综上所诉,我们可能少导入了什么supportSqlite依赖了,去sqlcipher看看好了,果然是少了DataBase的数据库支持的依赖。[? GitHub android-database-sqlcipher]

    然后就没问题了,虽然毫无技术含量的问题,但是感觉莫名滑稽。

    implementation 'net.zetetic:android-database-sqlcipher:4.3.0'
    implementation "androidx.sqlite:sqlite:2.0.1"
    

    在这里插入图片描述


? 前言
? Android Temporary
? NO.1 Retrofit
? NO.2 CameraX
? NO.4 Tinker