首页 > 代码库 > GreenDao3.0使用详解

GreenDao3.0使用详解

随着移动端的业务量的增大和用户体验的提高,SQLite的需求很明显了,大大小小的项目几乎成了必备,用我们项目经理的话来说:

1、不用管他什么数据,为了体验,先缓存一下!

2、什么?网络不好导致的?看什么,缓存啊!!!

真不知道他是在哪里听到的这个词,唉!

在他看来,缓存是如此简单的一件事情,当然,缓存其实并不难,就是有点麻烦而已!技术分享

之前我一直是用Realm,目前Realm被人称为移动端的新一代王者,但是对于知识,哪有嫌多的呢。


一、GreenDao和Realm对比

我在网上找了一张图片,很能说明问题:

技术分享

在小量数据的查询与删除等操作中,两者的差距基本可以忽略不计,超过同时插入、删除、查询1000条以上的数据分析得出。GreenDao在删除操作中,占明显优势,而Realm在添加与查询方面优于GreenDAO。各有千秋,看自己的选择。


二、GreenDao配置

1、导入相应的包

compile‘org.greenrobot:greendao:3.0.1‘
compile‘org.greenrobot:greendao-generator:3.0.0‘
2、配置app的Gradle

apply plugin: ‘org.greenrobot.greendao‘

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath ‘org.greenrobot:greendao-gradle-plugin:3.0.0‘
    }
}

greendao {
    schemaVersion 1
    daoPackage ‘com.example.anonymous.greendao.gen‘
    targetGenDir ‘src/main/java‘
}
3、配置greenDao

greendao {
    schemaVersion 1
    daoPackage ‘com.example.anonymous.greendao‘
    targetGenDir ‘src/main/java‘
}

 schemaVersion---->指定数据库schema版本号,迁移等操作会用到
 daoPackage-------->通过gradle插件生成的数据库相关文件,这里我设置的文件路径是com.example.anonymous.greendao
 targetGenDir-------->这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了


整体配置预览:

apply plugin: ‘com.android.application‘
apply plugin: ‘org.greenrobot.greendao‘

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath ‘org.greenrobot:greendao-gradle-plugin:3.0.0‘
    }
}

greendao {
    schemaVersion 1
    daoPackage ‘com.example.anonymous.greendao‘
    targetGenDir ‘src/main/java‘
}

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.anonymous.realmdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
        }
    }
}

dependencies {
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
    compile ‘com.android.support:appcompat-v7:25.0.1‘
    compile‘org.greenrobot:greendao:3.0.1‘
    compile‘org.greenrobot:greendao-generator:3.0.0‘
}

三、编写实体类(对应的是数据库的每张表)

@Entity
public class User {
    @Id
    private Long id;
    private String name;
}

@Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类
@Id:通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的


就这么简单含有两个字段的实体类

然后点击这个按钮

技术分享


builder完之后会有两个地方发生了变化


技术分享

这是GreenDao自动为你生成的,路径就是你在gradle中配置的路径

现在只有一个User表,如果再添加一个Age实体类,你在点击Make Project按钮,他还会把AgeDao自动生成出来


四、增、删、改、查

在增、删、改、查之前第一步做的就是需要对数据库进行初始化,不可能就这样直接对实体类操作,这样不太现实的,否则为什么GreenDao会自动生成这么多代码呢?

DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);  
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());  
DaoSession daoSession = daoMaster.newSession();  
UserDao userDao = daoSession.getUserDao();  
my-db是数据库的名字,自己随便写就行。

通过GreenDao生成的代码,我们可以获取到实体类的实例,也就是数据库表的实例,这样我们才能操作数据库


1、增加

User user1 = new User(null,"zhangsan");
userDao.insert(user1);

2、删除

User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();  
if(findUser != null){  
    userDao.deleteByKey(findUser.getId());  
}  

3、修改

User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();  
if(findUser != null) {  
    findUser.setName("lisi");  
    userDao.update(findUser);  
    Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();  
} else {  
    Toast.makeText(MyApplication.getContext(), "用户不存在", Toast.LENGTH_SHORT).show();  
}  

把zhangsan改成lisi

4、查询

List<User> userList = userDao.queryBuilder()  
       .where(UserDao.Properties.Id.notEq(1)) 
       .limit(5)  
       .build().list(); 

查询语句是数据库操作最多的,语句也比较复杂,具体的语句请去看官网

简单封装

其实这样写代码,作为程序员并不能满足,最起码的重用还是需要的,所以简单的封装一下吧

我们需要添加几个类来负责代码的重用工作,先看一下整体的工程结构:

技术分享

1、MyApplication:返回Context对象

2、DaoManager:初始化数据库,获取相应的操作对象

3、EntityManager:对数据库表的初始化,获取实体类的操作对象

public class MyApplication extends Application {
    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
        DaoManager.getInstance();
    }

    public static Context getContext() {
        return mContext;
    }
}


/**
 *  greenDao管理类
 */
public class DaoManager {
    private static DaoManager mInstance;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    private DaoManager() {
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);
        DaoMaster mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoMaster getMaster() {
        return mDaoMaster;
    }

    public DaoSession getSession() {
        return mDaoSession;
    }

    public static DaoManager getInstance() {
        if (mInstance == null) {
            mInstance = new DaoManager();
        }
        return mInstance;
    }
}



public class EntityManager {
    private static EntityManager entityManager;
    public UserDao userDao;

    /**
     * 创建User表实例
     *
     * @return
     */
    public UserDao getUserDao(){
        userDao = DaoManager.getInstance().getSession().getUserDao();
        return userDao;
    }

    /**
     * 创建单例
     *
     * @return
     */
    public static EntityManager getInstance() {
        if (entityManager == null) {
            entityManager = new EntityManager();
        }
        return entityManager;
    }
}

三个东西一看便知,但是这个东西怎么用呢?

// TODO: 2017/1/1 一句话就把相应的数据库表的实例返回,进行操作  
UserDao userDao = EntityManager.getInstance().getUserDao();
User user1 = new User(null,"zhangsan");
userDao.insert(user1);

DaoManager和EntityManager主要作用是对数据库和表的初始化工作抽出来作为复用,在Activity中使用的时候,我们可以直接操作表,不需要在初始化工作了,这篇文章作为我的学习笔记,希望也能为看到的朋友提供帮助!




GreenDao3.0使用详解