GreenDao3
一、GreenDao简介
greenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不在需要编写复杂的 SQL语句,在性能方面,greenDAO 针对 Android 进行了高度优化,最小的内存开销 、依赖体积小同时还是支持数据库加密。
二、核心类介绍
DaoMaster:
使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),我们可以通过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 创建不同模式的 SQLite 数据库。
DaoSession :
管理指定模式下的所有 DAO 对象,DaoSession提供了一些通用的持久性方法比如插入、负载、更新、更新和删除实体。
XxxDAO :
每个实体类 greenDAO 多会生成一个与之对应DAO对象,如:User 实体,则会生成一个一个UserDao 类
Entities:
可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。
三、GreenDao配置
3.1、设置仓库与插件(Project:build.gradle)
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.2' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin GreenDao } }
3.2、配置依赖(Module:app build.gradle)
apply plugin: 'org.greenrobot.greendao' // 头部添加apply plugin GreenDao dependencies { compile 'org.greenrobot:greendao:3.2.2' // GreenDao compile 'net.zetetic:android-database-sqlcipher:3.5.6'//加密库依赖(可选项) }
3.3、配置数据库相关信息(Module:app build.gradle)
android { //与dependencies平级,主要用于配置数据库相关信息的及自动生成的“DAO”资源的目录 greendao { schemaVersion 1//数据库版本号 daoPackage 'crazymo.src.greendao'//设置DaoMaster、DaoSession、Dao包名 targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 //targetGenDirTest:设置生成单元测试目录 //generateTests:设置自动生成单元测试用例 } }
四、开始GreenDao
4.1、创建新的实体类
package cn.com.lyk.wenote.been; import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; /** * Created by lyk on 2017/11/7. */ @Entity(schema = "",nameInDb = "") public class User { @Id private Integer userId; private String password; }
①实体@Entity的注解
schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表**
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表**
②基础属性注解
@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名举例:@Property (nameInDb=”name”)
@NotNul:设置数据库表当前列不能为空
@Transient:添加次标记之后不会生成数据库表的列
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名举例:@Property (nameInDb=”name”)
@NotNul:设置数据库表当前列不能为空
@Transient:添加次标记之后不会生成数据库表的列
③索引注解
@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束
4.2、自动生成dao
点击 Make Project(或者 Make Moudle ‘App’) 编译一下工程 。如果配置正确,会在配置的包目录下自动会生成 DaoMaster,DaoSession 和 UserDao 类 。

自动生成以后

4.3、初始化 GreenDao ( 通常初始化代码写在我们的 Application 类中)
package cn.com.lyk.wenote.app; import android.app.Application; import android.database.sqlite.SQLiteDatabase; import android.os.Environment; import com.orhanobut.logger.AndroidLogAdapter; import com.orhanobut.logger.Logger; import java.io.File; import cn.com.lyk.greendao.DaoMaster; import cn.com.lyk.greendao.DaoSession; import static cn.com.lyk.wenote.utils.Const.DB_NAME; /** * Created by lyk on 2017/11/1. */ public class MyApplication extends Application { public static final String APP_BASE_DIR_DB= Environment.getExternalStorageDirectory()+"/demo/interior/db/"; private DaoSession daoSession; @Override public void onCreate() { super.onCreate(); Logger.addLogAdapter(new AndroidLogAdapter());//Initialize mkdirs(); initGreenDao(); Logger.i("Application>>onCrate"); } private void initGreenDao() { DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, APP_BASE_DIR_DB + DB_NAME); SQLiteDatabase db = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); } private void mkdirs() { File file = new File(APP_BASE_DIR_DB); if (!file.exists()) { file.mkdirs(); } } public void cleanSession(){ daoSession.clear(); } public DaoSession getDaoSession() { return daoSession; } }
4.4、获取Dao
private void initGreenDao() { UserDao userDao = ((MyApplication) getApplication()).getDaoSession().getNoteDao(); }
五、增删改查
5.1、添加
User user=new User(); user.setPassword("12345"); userDao.insert(user);
5.2、修改
User user=new User(); user.setPassword("11111"); userDao.update(user);
5.3、删除
userDao.deleteByKey(id);
5.4、查询
userDao.loadAll(); //查询所有
userDao.loadByRowId(id); //根据Id查询
//eq查询 QueryBuilder qb = userDao.queryBuilder(); ArrayList<User> list = (ArrayList<User>) qb.where(UserDao.Properties.Id.eq(id)).list(); if (list.size() > 0) { for (User user : list) { text = text + "\r\n" + user.getName(); } } else { Toast.makeText(mContext, "找不到相关的数据", 0).show(); }
//模糊查询 List<User> staffs = userDao.queryBuilder().where(UserDao.Properties.Name.like("%黄%")).orderAsc(UserDao.Properties.Id).list();
//gt大于 List<User> staffs =userDao.queryBuilder().where(UserDao.Properties.Age.gt(23)).orderAsc(UserDao.Properties.Age).list();
//lt小于 List<User> staffs =userDao.queryBuilder().where(UserDao.Properties.Age.lt(23)).orderAsc(UserDao.Properties.Age).list();
六、多表关联
@ToOne //表示一对一(one to one)
@Entity public class Order { @Id private Long id; private long customerId; @ToOne(joinProperty = "customerId") private Customer customer; } @Entity public class Customer { @Id private Long id; }
@ToMany //表示一对多(one to many)
@Entity public class Customer { @Id private Long id; @ToMany(referencedJoinProperty = "customerId") @OrderBy("date ASC") private List orders; } @Entity public class Order { @Id private Long id; private Date date; private long customerId; }
joinProperties这个参数是referencedJoinProperty 参数的升级版,可以自己定义外键。
@Entity public class Customer { @Id private Long id; @Unique private String tag; @ToMany(joinProperties = { @JoinProperty(name = "tag", referencedName = "customerTag") }) @OrderBy("date ASC") private List<Site> orders; } @Entity public class Order { @Id private Long id; private Date date; @NotNull private String customerTag; }
N:M 表示多对多(many to many)
@Entity public class Product { @Id private Long id; @ToMany @JoinEntity( entity = JoinProductsWithOrders.class, sourceProperty = "productId", targetProperty = "orderId" ) private List<Order> ordersWithThisProduct; } @Entity public class JoinProductsWithOrders { @Id private Long id; private Long productId; private Long orderId; } @Entity public class Order { @Id private Long id; }