greenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不在需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小。greenDAO数据库是非常适合存储大量数据,从而加速事项。使用greenDAO,大多数实体可以插入,更新和在速率加载每秒几千实体。
在这里建议大家使用最新版的greenDAO,不然会出现各种各样的问题
1.Project: build.gradle
buildscript { repositories { google() jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:3.4.2' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // 添加插件 更好支持GreenDao } }2.Module:app build.gradle 最上面引入对应的插件
apply plugin: 'org.greenrobot.greendao' // 添加应用依赖插件导入依赖,这里使用的是3.3.0,建议使用3.3.0或是3.2.2版本的
implementation 'org.greenrobot:greendao:3.3.0' // 添加库配置greenDao的参数
greendao { schemaVersion 1 targetGenDir 'src/main/java' daoPackage "${android.defaultConfig.applicationId}.greenDao" }然后重新sync一下项目即可
1.实体类:
package com.st.myriven.greenDao; import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.Generated; @Entity public class User { @Id private long id; private String name; private int age; //省略了getter,setter 方法 }创建完实体类后,重新build下项目(如果出现问题,先clean在进行build),这时候你会发现会在之前指定的目录下多出几个类,我们接下来就是通过这几个类进行操作数据库 2.创建一个类去继承Application,需要在AndroidManifest.xml文件中置顶application的名字 代码:
public class AppContext extends Application { private DaoSession daoSession; @Override public void onCreate() { super.onCreate(); initDreenDao(); } /** * greendao数据库初始化 */ private void initDreenDao() { DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "demo.db"); SQLiteDatabase db = devOpenHelper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); } /** * 获取 DaoSession */ public DaoSession getDaoSession() { return daoSession; } }3.使用
public class TestActivity extends Activity { AppContext myApp; DaoSession daoSession; UserDao userDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); myApp= (AppContext) getApplication(); daoSession = myApp.getDaoSession(); userDao = daoSession.getUserDao(); User user = new User(); user.setId(1); user.setName("张三"); user.setAge(22); //userDao.insert(user);//如果id重复,会报错, userDao.insertOrReplace(user); List list = selectAll(); Log.i("info",list.get(0).toString()); } public List selectAll(){ return userDao.loadAll();// 查询所有记录 } }打印到日志中
@Id: 对应数据表中的 Id 字段 @Entity: 使用@Index作为一个属性来创建一个索引,默认是使用字段名 @Index: 使用@Index作为一个属性来创建一个索引,默认是使用字段名 @NotNull: 设置数据库表当前列不能为空 @Unique: 表名该属性在数据库中只能有唯一值 @Property: 设置一个非默认关系映射所对应的列名,默认是使用字段名 @OrderBy: 更加某一字段排序
当然还有很多注解,在这里不一一介绍,这些相对比较常见
在这里所有的语句均使用上面的userDao进行操作
插入语句可直接引用上面的
User user = new User(); user.setUserId(1); user.setName("小明"); user.setAge(16); userDao.insert(user); userDao.insertOrReplace(user);insertOrReplace和insert区别 insert时,当id相同时,会报错 insertOrReplace,当id相同时,不会报错,只是会替换一下
当然还有很多查询的方式,不在一一例举,以下是会用到的语法介绍:
whereOr: where语句里面写的条件都是用“且”连接,whereOr里的语句使用“或”连接 distinct : 直接过滤掉重负字段 limit: 分页n个一页,一般和offset结合使用 offset: 忽略查询出的前n条结果 orderAsc: 以字段升序排序 orderDesc: 以字段降序 preferLocalizedStringOrder : 本地化字符串排序 orderCustom: 自定义排序 里面需要传两个参数: 一个属性 和对应的排序方案 ASC 或是 DESC orderRaw: 也是自定义排序, 把字段和 排序方案 写在一个字符串传入 stringOrderCollation: 也是自定义排序 可以合并多个升降排序方案 以日期升序 且 价格降序