零蚀
[🔗 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 将自己的一个属性与另一个表建立关联(外键) @ToMany referencedJoinProperty,类似于外键约束 @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 } }
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