GreenDao 3.2教程

GreenDao作为一个ORM框架,大家都应该听说过。过多废话不说,直接上干货。实际是没话说,不会介绍,也不想去翻译官网的那些什么轻量级,高效的,快速开发一些什么优点。想了解的朋友,直接去官网看吧。

GreenDao的引入

无非就是配置Gradle

// In your root build.gradle file:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}
 
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library
}

module的gradle文件

喜欢的朋友,可以更改greenDao的生成路径。

android {
    compileSdkVersion 24
    buildToolsVersion '25.0.0'
    defaultConfig {
        applicationId "com.jeongho.bt3000"
        minSdkVersion 21
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        sourceSets{
            main{
                java.srcDirs=['src/main/java','src/main/java-gen']
            }
        }

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    greendao{
        schemaVersion 1
        //设置Gen路径
        targetGenDir=['app/src/main/java-gen']
    }
}

Entity实体

就是javabean + 注释

@Entity
public class DotaHero {
    @Id
    private long id;

    private String name;

    private int hp;

    private int mp;

    private int exp;

    @Generated(hash = 623523123)
    public DotaHero(long id, String name, int hp, int mp, int exp) {
        this.id = id;
        this.name = name;
        this.hp = hp;
        this.mp = mp;
        this.exp = exp;
    }

    @Generated(hash = 500107644)
    public DotaHero() {
    }

    public long getId() {
        return this.id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHp() {
        return this.hp;
    }

    public void setHp(int hp) {
        this.hp = hp;
    }

    public int getMp() {
        return this.mp;
    }

    public void setMp(int mp) {
        this.mp = mp;
    }

    public int getExp() {
        return this.exp;
    }

    public void setExp(int exp) {
        this.exp = exp;
    }
}

通过daoSession.getXXXXDao()获取XXXXDao来进行Entity的insert、query等操作

那么问题来了,daoSession怎么生成?

       DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "DOTA-db", null);
       SQLiteDatabase db = helper.getWritableDatabase();
       DaoMaster master = new DaoMaster(db);
       daoSession = master.newSession();

有的小伙伴发现,DaoMaster导包怎么导不进来,代码一片红,整个人一脸懵逼。。。

写完实体类的时候,重新Make Project(Ctrl+F9/Cmd+F9),就会发现DaoMaster导进来了。还能通过daoSession获取到实体类的Dao,真特么神奇。。

增删改查

  DotaHeroDao dotaHeroDao = daoSession.getDotaHeroDao();
  DotaHero hero = new DotaHero()
  hero.setId(1);
  hero.setName("Jugg");
  hero.setHp(50);
  hero.setMp(50);
  hero.setExp(200);
  dotaHeroDao.insert(hero);

  • 根据ID来删除
dotaHeroDao.deleteByKey((long) 1);
  • 删除所有
dotaHeroDao.deleteAll();

查绝逼是数据库操作中最麻烦的了。想想脑袋都大。

GreenDao中是使用QueryBuilder来进行数据查询,省去了编写大量的SQL语句。
举个最简单的例子:

  • 查询HP等于60的所有英雄
List<DotaHero> heros = dotaHeroDao.queryBuilder()
                .where(DotaHeroDao.Properties.Hp.eq(60))
                .list();
  • 根据HP顺序排列、倒序排列
List<DotaHero> heros = dotaHeroDao.queryBuilder()
                .orderAsc(DotaHeroDao.Properties.Hp)
                .list();
List<DotaHero> heros = dotaHeroDao.queryBuilder()
                .orderDesc(DotaHeroDao.Properties.Hp)
                .list();
  • 输出查询结果的子集

    limit:限制输出数量

//取HP最大的10个英雄
List<DotaHero> heros = dotaHeroDao.queryBuilder()
                .orderDesc(DotaHeroDao.Properties.Hp).limit(10)
                .list();

offset:设置输出的偏移量

offset 必须配合limit使用,输出集合跳过前N个对象

//跳过HP最大的5个 输出第6~第15的十个英雄
List<DotaHero> heros = dotaHeroDao.queryBuilder()
              .orderDesc(DotaHeroDao.Properties.Hp).limit(10).offset(5)
              .list();

待续更新,先上GitHub项目地址

    原文作者:Jeongho
    原文地址: https://www.jianshu.com/p/a26408ebe997
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞