GreenDao3

作者: 李玉凯 分类: Android 发布时间: 2017-12-03 16:57

一、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:标记创建数据库表**
②基础属性注解
@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@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;
  }

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

邮箱地址不会被公开。 必填项已用*标注

67 − 62 =