零蚀
[? 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}}
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()} }
-
step 4 数据库加密
官网上有很多如何使用greenDao加密的文章关于,就是改动一行代码,或者再加个依赖
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可能觉得这么菜的问题所以拒绝回答,臆想中…)。
所以综上所诉,我们可能少导入了什么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