数据库GreenDao

570 阅读2分钟

GreenDao 简介

greenDAO的源代码,有一部分是固有代码,另一部分则是编译生成的,他们协同合作完成了greenDAO的功能,即ORM(Object-relational mapping)。

关于ORM,我们可以参考官网的图:

image.png

从上图,我们可以很清楚的看到,greenDAO提供了从关系型数据库到Java对象的映射,从而使得开发者不用直接操作数据库而操作Java对象就可以了,减少了开发者的负担。

主流程梳理

简易的类关系图,可以参考官网的图:

image.png

配置

1.Add this to your root build.gradle (project level):

buildscript {
   
    dependencies {
        ...
        //数据库操作框架
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
    }
}

2.And this to our app's build.gradle (module level):

apply plugin: 'org.greenrobot.greendao' // after applying Android plugin
android {
   ...
    greendao {
        schemaVersion rootProject.dbVersion//版本控制
        daoPackage 'com.xxx.xxx.greendao.gen'
        targetGenDir 'src/main/java'
    }
}
dependencies { 
     //操作数据库 greendao
    api 'org.greenrobot:greendao:3.3.0'
    api 'org.greenrobot:greendao-generator:3.3.0'
    api 'io.github.yuweiguocn:GreenDaoUpgradeHelper:v2.2.1'
}

3.使用

  • 创建实体类

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Generated;
import org.greenrobot.greendao.annotation.Id;

@Entity
public class KeyWordBean {

    @Id(autoincrement = true)
    Long id;
    String keyword;
    @Generated(hash = 1121882475)
    public KeyWordBean(Long id, String keyword) {
        this.id = id;
        this.keyword = keyword;
    }
    @Generated(hash = 673900408)
    public KeyWordBean() {
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getKeyword() {
        return this.keyword;
    }
    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }
}

  • 数据库版本更新控制类
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.github.yuweiguocn.library.greendao.MigrationHelper;
import com.lishuaihua.data_module.greendao.gen.DaoMaster;
import org.greenrobot.greendao.database.Database;

public class MySQLiteOpenHelper extends DaoMaster.OpenHelper {

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
            @Override
            public void onCreateAllTables(Database db, boolean ifNotExists) {
                DaoMaster.createAllTables(db, ifNotExists);
            }

            @Override
            public void onDropAllTables(Database db, boolean ifExists) {
                DaoMaster.dropAllTables(db, ifExists);
            }
        },  KeyWordBeanDao.class);
    }
}

  • 数据库操作统一管理类
public  class GreenDaoDataManager {
    private final static String TAG = GreenDaoDataManager.class.getSimpleName();
    private final static String dbName = "green_db";
    private static GreenDaoDataManager mInstance;
    private MySQLiteOpenHelper openHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    public DaoSession getmDaoSession() {
        return mDaoSession;
    }

    public GreenDaoDataManager(Context context) {
        openHelper = new MySQLiteOpenHelper(context, dbName, null);
        db = openHelper.getWritableDatabase();
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }


    /**
     * 初始化
     * @param context
     */
    public static void init(Context context) {
        if (mInstance == null) {
            synchronized (GreenDaoDataManager.class) {
                if (mInstance == null) {
                    mInstance = new GreenDaoDataManager(context);
                }
            }
        }
    }

    /**
     * 获取单例引用
     */
    public static GreenDaoDataManager getInstance() {
        if (mInstance == null) {
            try {
                throw new Exception("please init dbmanager before use");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return mInstance;
    }

    /**
     * 新增 .修改
     * @param keyWordBean
     */
    public void insertKeyWordBean(KeyWordBean keyWordBean){
        List<KeyWordBean> keyWordBeans = queryKeyWordBeans();
        KeyWordBean repeatKeyWordBean=null;
        for (int i = 0; i < keyWordBeans.size(); i++) {
            KeyWordBean keywordBean=keyWordBeans.get(i);
            if (keywordBean.getKeyword().equals(keyWordBean.getKeyword())){
                repeatKeyWordBean=keywordBean;
            }
        }
        if (repeatKeyWordBean!=null){
            removeKeyWordBean(repeatKeyWordBean);
        }
        mDaoSession.getKeyWordBeanDao().insertOrReplace(keyWordBean);
    }

    /**
     * 删全部
     */
    public void clearKeyWordBeans() {
        mDaoSession.getKeyWordBeanDao().deleteAll();
    }

    /**
     * 删单个
     * @param keyWordBean
     */
    public void removeKeyWordBean(KeyWordBean keyWordBean){
        mDaoSession.getKeyWordBeanDao().deleteByKey(keyWordBean.getId());
    }

    /**
     * 查询
     * @return
     */
    public List<KeyWordBean> queryKeyWordBeans(){
        return   mDaoSession.getKeyWordBeanDao().queryBuilder().build().list();
    }
    
}
  • 数据库统一操作管理类初始化(Application)
  GreenDaoDataManager.init(this)
  • 增删改查
//增,改
 var keyWordBean=KeyWordBean()
 keyWordBean.keyword="关键词"
 GreenDaoDataManager.getInstance().insertKeyWordBean(keyWordBean)
 //删
 GreenDaoDataManager.getInstance().removeKeyWordBean(keyWordBean) 
 //查
 var queryKeyWordBeans = GreenDaoDataManager.getInstance().queryKeyWordBeans()