GreenDao3.1用法详解

原创 2016年08月30日 16:08:35

greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。

GreenDao 优点:

1.性能高,号称Android最快的关系型数据库
2.内存占用小
3.库文件比较小,小于100K
4.支持数据库加密 greendao支持SQLCipher进行数据库加密
5.简洁易用的API

GreenDao 3.1改动:

GreenDao 3.0最大的变化就是采用注解的方式通过编译方式生成Java数据对象和DAO对象,3.0之前需要通过新建GreenDaoGenerator工程生成Java数据对象和DAO对象,非常的繁琐。


GreenDao 3.1使用方式:

第一步:在项目的Build.gradle中添加如下配置:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
    }
}

第二步:导入

compile 'org.greenrobot:greendao:3.1.1'
compile 'org.greenrobot:greendao-generator:3.1.0'

第三步:添加配置


红色方框中字段解释:

schemaVersion: 数据库schema版本,也可以理解为数据库版本号
daoPackage:设置DaoMaster、DaoSession、Dao包名
targetGenDir:设置DaoMaster、DaoSession、Dao目录
targetGenDirTest:设置生成单元测试目录
generateTests:设置自动生成单元测试用例

第四步:写实体类
@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    private String name;
    private int age;
    private boolean isBoy;
}
make project后变成会自动帮你生成get/set方法,如下:
@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    private String name;
    private int age;
    private boolean isBoy;
    public boolean getIsBoy() {
        return this.isBoy;
    }
    public void setIsBoy(boolean isBoy) {
        this.isBoy = isBoy;
    }
    public int getAge() {
        return this.age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Generated(hash = 1724489812)
    public User(Long id, String name, int age, boolean isBoy) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.isBoy = isBoy;
    }
    @Generated(hash = 586692638)
    public User() {
    }
}
第五步:封装GreenDao调用方法:
public class GreenDaoUtils {

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    private static GreenDaoUtils greenDaoUtils;

    private GreenDaoUtils(){}

    public static GreenDaoUtils getSingleTon(){
        if (greenDaoUtils==null){
            greenDaoUtils=new GreenDaoUtils();
        }
        return greenDaoUtils;
    }

    private void initGreenDao(){
        mHelper=new DaoMaster.DevOpenHelper(MyApplication.getApplication(),"test-db",null);
        db=mHelper.getWritableDatabase();
        mDaoMaster=new DaoMaster(db);
        mDaoSession=mDaoMaster.newSession();
    }

    public DaoSession getmDaoSession() {
        if (mDaoMaster==null){
            initGreenDao();
        }
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        if (db==null){
            initGreenDao();
        }
        return db;
    }

}


第六步:执行增删改查
UserDao dao=GreenDaoUtils.getSingleTon().getmDaoSession().getUserDao();

public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_c:
                User insertData=new User(null,edit_name.getText().toString(),21,false);
                dao.insert(insertData);
                break;
            case R.id.btn_r:
                List<User> users = dao.loadAll();
                for (int i=0;i<users.size();i++){
                    Log.i("woyaokk","结果:"+users.get(i).toString());
                }
                break;
            case R.id.btn_u:
                List<User> userss = dao.loadAll();
                User user=new User(userss.get(0).getId(),edit_name.getText().toString(),22,true);
                dao.update(user);
                break;
            case R.id.btn_d:
                String s = edit_id.getText().toString();
                long l = Long.parseLong(s);
                dao.deleteByKey(l);
                break;
        }
    }

以上即为GreenDao的简单使用方法,接下来详细讲解其中的一些API。

API:

1.)实体@Entity注解

schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表**

2.)基础属性注解

@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名举例:@Property (nameInDb="name")
@NotNul:设置数据库表当前列不能为空
@Transient:添加次标记之后不会生成数据库表的列

3.)索引注解

@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束

4.)关系注解

@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系

在建立数据库时,每一个实体类会建立一张数据表,代表一个关系,而不同实体之间必然存在一定的关系,反映到数据表上也需要建立关系。
比如一个用户的账户都有对应的头像picture,且假设每个用户的头像Picture对象都不同,因此每个picture也对应一个用户,这就是一对一的关系,而在网上购物可以下订单,每个用户可以有多个订单Oder,而每个Oder都对应一个用户User,这是一对多的关系。在数据表的关系中可以通过外键表示这种一对一和一对多的关系。除此以外还有多对多的关系,在对象的结构中每个Oder包含多个物品Item,而每个Item也可能包含在多个Oder中,因此这是多对多的关系,在数据表中需要额外的表表示对应关系,如Oder_Item表,表示一个Oder与一个Item具有关系。
在greenDao中,使用@ToOne表示一对一的关系,使用@ToMany表示一对多的关系,而多对多的关系支持度不够好,目前还不完善,使用较为复杂。

    1. @ToOne
      比如每个用户都有一个对应Picture属性,需要一个pictureId代表这个Picture属性,通过@ToOne(joinProperty = "XXXX")指定pictureId,在数据表中则会有pictureId这一列作为外键,与Picture数据表建立联系,如果你没有指定pictureId, greenDAO也会在数据表中生成一列属性其作用与指定的pictureId相同,而实体类中则可以使用User的Picture属性,代码如下:
@Entity
public class User {
    @Id
    private Long id;
    private String name;
    private Long pictureId;
    @ToOne(joinProperty = "pictureId")
    private Picture picture;

    ....
}

当然greenDAO会为我们生成其他的代码,如构造器,getter和setter等,在代码中可以直接使用user.getPicture()和setPicture,而在数据表中则是pictureId是指向Picture数据表的外键。Picture的实体类如下:

@Entity
public class Picture {
    @Id
    private long pictureId;

    ...
}
    1. @ToMany
      一对多的关系,定义了一个实体对象对应着多个实体对象,比如一个用户对应多个Order, 在建立数据表示会在目标实体(即一对多的那个多的实体类)的数据表中建立外键,指向源实体类(一对多中的一那个实体类)的数据表。目标数据表中的外键属性由@ToMany(referencedJoinProperty = "XXXX")指定。

如User中添加List<Order> orders属性:

@Entity
public class User {
    @Id
    private Long id;
    private String name;
    private Long pictureId;
    @ToOne(joinProperty = "pictureId")
    private Picture picture;
    @ToOne
    private Picture thumbnailPicture;
    @ToMany(referencedJoinProperty = "ownerId")
    private List<Order> oders;

    ...
}

Order的实例代码为:

@Entity
public class Order {
    @Id
    private long id;
    private long ownerId;

    ...
}

在build->Make Project之后会生成对应代码,此时在代码中可以使用User#getOrders()获取user的所有对应的order的List. 在这种情况下, ownerId是在Order中的外键,指向User的主键Id。

5.)排序算法
List<User> userList = userDao.queryBuilder()  
       .where(UserDao.Properties.Id.notEq(999))  
       .orderAsc(UserDao.Properties.Id)  
       .limit(5)  
       .build().list();
QueryBuilder qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq("Joe"),
qb.or(Properties.YearOfBirth.gt(1970),
qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
List youngJoes = qb.list();
当然,也可以通过纯SQL语句去查询,但不推荐。
先通过queryBuilder生成查找构造器,然后写相应条件进行查询
where 条件判断
orderAsc 排序
limit 查询条数
list() 查询结果为一个集合
unique()或uniqueOrThrow(),返回单个结果,如果没有满足条件的结果,前者返回null, 后者抛出异常














Android GreenDao使用详解

做Android开发总难免与数据库打交道的。但是原生的数据库操作总是那么的复杂且效率很低。所以决定使用第三方的数据库操作。目前有很多的第三方的数据库框架如Ormlite这是目前比较火的Orm数据库框架...
  • Super_codingman
  • Super_codingman
  • 2015年12月18日 12:10
  • 2165

玩转Android之数据库框架greenDAO3.0使用指南

用过ActiveAndroid、玩过ORMLite,穿过千山万水,最终还是发现greenDAO好用,ActiveAndroid我之前有一篇文章介绍过 玩转Android之数据库框架ActiveAndr...
  • u012702547
  • u012702547
  • 2016年08月17日 20:05
  • 31350

GreenDao3使用完全解析

1,gradle配置(官网样例地址https://github.com/greenrobot/greenDAO/blob/master/examples/RxDaoExample/build.grad...
  • qq_21763489
  • qq_21763489
  • 2017年05月27日 12:08
  • 1124

GreenDao3.0使用详解

随着移动端的业务量的增大和用户体验的提高,SQLite的需求很明显了,大大小小的项目几乎成了必备,用我们项目经理的话来说: 1、不用管他什么数据,为了体验,先缓存一下! 2、什么?网络不好导致的?看什...
  • u014752325
  • u014752325
  • 2017年01月04日 10:47
  • 9781

GreenDao的使用详解

在Android实际开发中,当要存储一些数据时,大家首先会想到的是什么存储形式?有人说数据库有人说文件。当然两种方式都行。今天就给大家介绍介绍第三方框架GreenDao的使用。好费话不多说,正式开始介...
  • Jamy2015
  • Jamy2015
  • 2016年06月23日 11:20
  • 3878

Android ORM 框架:GreenDao 使用详解(进阶篇)

本文作者:speedy CSDN 专栏:http://blog.csdn.net/speedystone/article/details/74193053 掘金专栏:https://jue...
  • speedystone
  • speedystone
  • 2017年07月03日 14:31
  • 516

GreenDao详解

  • 2015年01月12日 16:00
  • 4.88MB
  • 下载

greendao的使用(简洁易懂)

今天在项目里使用到了greendao,记录一下greendao的使用过程。greendao是对sqlite数据库操作的封装,可以让我们更加方便的使用sqlite,其它类似的框架还有OrmLite、Su...
  • baidu_31093133
  • baidu_31093133
  • 2016年06月14日 23:20
  • 9260

GreenDao的使用方法

GreenDao的使用方法详解 ---------------------- GreenDao orm数据库框架 优势: 1:性能最大化 2:内存...
  • qq_15807167
  • qq_15807167
  • 2016年06月30日 11:34
  • 10234

GreenDao 3.x 注解中ToOne和ToMany的个人理解

GreenDao是什么东西这个就不用多说了。自从GreenDao升级到3.0之后,编译的方法发生了改变。当然这个改变是有助于快速开发的。 区别在哪随便百度一下都可以知道。这里就不多说了。 这里主要说的...
  • maxliyu
  • maxliyu
  • 2016年12月02日 12:44
  • 3765
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GreenDao3.1用法详解
举报原因:
原因补充:

(最多只允许输入30个字)