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项目地址