简单介绍
greenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不在需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小。greenDAO数据库是非常适合存储大量数据,从而加速事项。使用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相同时,不会报错,只是会替换一下
(二)删除
userDao.delete(user);//根据对象删除
userDao.deleteByKey(user.getId());//根据id删除
userDao.deleteAll();//删除全部
(三)修改
userDao.update(user);
(四)查询
// 查询所有记录
userDao.loadAll();
//根据ID查询
userDao.loadByRowId(user.getId());
//查询成年的用户
userDao.queryRaw("where AGE>?","18");
//模糊查询 para是你的参数
userDao.queryBuilder().whereOr(userDao.Properties.Name.like("%"+para+"%"),BedInfoDao.Properties.Num.like("%"+para+"%")).list()
//根据条件查询
userDao.queryBuilder().where(userDao.Properties.Id.eq(user.getId())).limit(1).list();
当然还有很多查询的方式,不在一一例举,以下是会用到的语法介绍:
whereOr: where语句里面写的条件都是用“且”连接,whereOr里的语句使用“或”连接
distinct : 直接过滤掉重负字段
limit: 分页n个一页,一般和offset结合使用
offset: 忽略查询出的前n条结果
orderAsc: 以字段升序排序
orderDesc: 以字段降序
preferLocalizedStringOrder : 本地化字符串排序
orderCustom: 自定义排序 里面需要传两个参数: 一个属性 和对应的排序方案 ASC 或是 DESC
orderRaw: 也是自定义排序, 把字段和 排序方案 写在一个字符串传入
stringOrderCollation: 也是自定义排序 可以合并多个升降排序方案 以日期升序 且 价格降序