天天看点

Android GreenDao使用(一)创建数据库

使用GreenDao已经好久了,不知不觉已经更新到3.x版本了。

记录一下使用基本方法:

1.先在app目录下的main文件夹下新建java-gen目录:

Android GreenDao使用(一)创建数据库

注:一会的java文件指定生成在这个目录下, 当然这不是必须的,你可以自定义目录,这样做的目的是,目录结构清晰等这那的。

2.在app下build.gradle中指定识别java-gen,顺便倒入greendao依赖:

compile "org.greenrobot:greendao:3.2.2"
           
sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/java-gen']
        }
    }
           

3.新建java工程:

Android GreenDao使用(一)创建数据库

然后在java工程中倒入依赖:

compile 'org.greenrobot:greendao-generator:3.2.2'
           

4.在java工程中新建一个java类:GreenDaoGenerator,其中我新建了一个表后运行这个java类,

greendao会根据我们的设置和表新建的字段,直接将需要的类生成到刚才我们指定的目录下:

package com.example;

import org.greenrobot.greendao.generator.DaoGenerator;
import org.greenrobot.greendao.generator.Entity;
import org.greenrobot.greendao.generator.Schema;

/**
 * java工程生成数据库表
 */
public class GreenDaoGenerator {

    public static void main(String[] args){

        // 生成数据库实体类xxentity 对应的是数据库的表
        Schema schema = new Schema(1, "com.school.entity");
        addTestGroup(schema);
        schema.setDefaultJavaPackageDao("com.school.dao");

        try {
            new DaoGenerator().generateAll(schema, "/Users/katsurayasubumi/StudioProjects/Reliable_TestInput/app/src/main/java-gen");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 测试项目分组表
     */
    private static void addTestGroup(Schema schema){
        Entity entity = schema.addEntity("TestGroup");
        entity.addIdProperty();
        entity.addIntProperty("group");
        entity.addStringProperty("name");
    }


}
           

注:1.其中entity.addIdProperty();是给这张表新建一个主键,自增长的id。你也可以换成你实际需求中的唯一标识的”id“。

2.main函数中Schema在实例化的时候,第一个参数为数据库版本号,第二个参数是生成对应表实体类的目录。下面setDefal..是指定greendao生成的类的目录。

Android GreenDao使用(一)创建数据库

上图就是运行java工程之后,对应目录下生成了对应的文件。

5.接下来再来封装一下数据库操作类。

public class DaoManager {

    private static final String TAG = DaoManager.class.getSimpleName();

    // 数据库名称
    private static final String DB_NAME = "reliable.sqlite";

    // 多线程访问
    private volatile static DaoManager manager;

    private static DaoMaster.DevOpenHelper helper;

    private static DaoMaster daoMaster;

    private static DaoSession daoSession;

    private Context context;

    /**
     * 使用单例模式获得操作数据库的对象
     */
    public static DaoManager getInstance(){
        DaoManager instance = null;
        if (manager == null){
            synchronized (DaoManager.class){
                if (instance == null){
                    instance = new DaoManager();
                    manager = instance;
                }
            }
        }
        return manager;
    }

    public void init(Context context){
        this.context = context;
    }

    /**
     * 判断是否存在数据库
     * 如果没有则创建数据库
     */
    public DaoMaster getDaoMaster(){
        if (daoMaster == null){
//            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
            MyOpenHelper myOpenHelper = new MyOpenHelper(context, DB_NAME, null);
            daoMaster = new DaoMaster(myOpenHelper.getWritableDatabase());
        }
        return daoMaster;
    }

    /**
     * 完成对数据库的添加删除修改查询等的操作
     * 注:仅仅是一个接口
     */
    public DaoSession getDaoSession(){
        if (daoSession == null){
            if (daoMaster == null){
                daoMaster = getDaoMaster();
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    /**
     * 打开输出日志的操作
     * 注:默认是关闭的
     */
    public void setDebug(){
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }

    /**
     * 关闭所有的操作
     * 注:数据库开启之后,使用完毕必须要关闭
     */
    public void closeConnection(){
        closeHelper();
        closeDaoSession();
    }
    public void closeHelper(){
        if (helper != null){
            helper.close();
            helper = null;
        }
    }
    public void closeDaoSession(){
        if (daoSession != null){
            daoSession.clear();
            daoSession = null;
        }

    }

}
           

6.最后就是对表具体的操作了,下一篇来记录: