NO.3 GreenDao(&加密问题)

零蚀
[🔗 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 1
            daoPackage 'ash.com.greendao_202043.greendao'//这个是生成代码保存的包名
            targetGenDir 'src/main/java'//保存到java代码路径
        }
    
    }
    

  • step 2 构建bean类
    注解含义
    @Entity用于标识这是一个需要Greendao帮我们生成代码的bean
    @Id标明主键,括号里可以指定是否自增
    @Property用于设置属性在数据库中的列名(默认不写就是保持一致)
    @NotNull非空
    @Transient标识这个字段是自定义的不会创建到数据库表里
    @Unique添加唯一约束
    @ToOne将自己的一个属性与另一个表建立关联(外键)
    @ToManyreferencedJoinProperty,类似于外键约束
    @JoinProperty对于更复杂的关系,可以使用这个注解标明目标属性的源属性
    @Entity
    public class TestBean {
        @Id
        private Long id;
        @NotNull
        private 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
            // greenDao
            val helper = DaoMaster.DevOpenHelper(this, "new_db")
            val db = helper.writableDb
            daoSession = 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零蚀zero eclipse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值