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;
}


