在AndroidStudio4.1.1上使用GreenDao

发布时间 2023-08-15 14:01:01作者: 飘杨......

一、概述

  项目中需要用到数据库的能力,对比以及根据以往的经验,决定使用GreenDao。

二、实际操作步骤

  第一步:在项目下的.gradle文件中加入插件:classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin

   第二步:在module目录下的.gradle文件夹中进行操作

    a.引入greendao

implementation 'org.greenrobot:greendao:3.3.0' // add library

    b.在android{}大括号中加入,如下所示:ps:我项目是kotlin和java混编如果设置了targetGenDir 目录则无法生成DaoMaster和DaoSession,所以我把指定的目录注释了

greendao {
        schemaVersion 1 //数据库版本号
        daoPackage 'com.tony.demo.greendao' //填写自己的包名+文件夹test
        // 设置DaoMaster、DaoSession、Dao 包名
//        targetGenDir 'src.main.java'//设置DaoMaster、DaoSession、Dao目录
        //主要此时的这行代码如果在生成之后没有出现以下的三个类那么采取注释掉
    }

    c.引入greendao插件,这里需要注意一点:如果项目中使用了apply plugin: 'kotlin-kapt',则kapt插件的位置必须在greendao的下面,不然编译不通过

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    id 'org.greenrobot.greendao'
}

  第三步:新建一个实体类,然后build-->rebuild项目。之后make project就可以生成DaoMaster和DaoSession了

@Entity
public class Student {
    @Id
    private String studentId;
    @Property
    private String studentName;
    @Property
    private String studentAge;public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getStudentAge() {
        return studentAge;
    }

    public void setStudentAge(String studentAge) {
        this.studentAge = studentAge;
    }
}

   第四步:进行增删改查的测试

  

/**
 * Creator: tony
 * Date: 2023/8/15
 * Description:数据库管理类
 */
public class DaoManager {
    private static final String DB_NAME = "luyinji_aic.db";//数据库名称
    private static DaoManager mDaoManager;
    private DaoMaster.DevOpenHelper mHelper;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    private Context context;

    private DaoManager(Context context) {
        this.context = context;
    }

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

    /**
     * 获取DaoSession
     *
     * @return
     */
    public synchronized DaoSession getDaoSession() {
        if (null == mDaoSession) {
            mDaoSession = getDaoMaster().newSession();
        }
        return mDaoSession;
    }

    /**
     * 设置debug模式开启或关闭,默认关闭
     *
     * @param flag
     */
    public void setDebug(boolean flag) {
        QueryBuilder.LOG_SQL = flag;
        QueryBuilder.LOG_VALUES = flag;
    }


    /**
     * 关闭数据库
     */
    public synchronized void closeDataBase() {
        closeHelper();
        closeDaoSession();
    }

    /**
     * 判断数据库是否存在,如果不存在则创建
     *
     * @return
     */
    private DaoMaster getDaoMaster() {
        if (null == mDaoMaster) {
            mHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
            mDaoMaster = new DaoMaster(mHelper.getWritableDb());
        }
        return mDaoMaster;
    }

    private void closeDaoSession() {
        if (null != mDaoSession) {
            mDaoSession.clear();
            mDaoSession = null;
        }
    }

    private void closeHelper() {
        if (mHelper != null) {
            mHelper.close();
            mHelper = null;
        }
    }
}
/**
 * Creator: tony
 * Date: 2023/8/15
 * Description:数据库帮助类
 */
public class BaseBeanManager<T, K> {
    private AbstractDao<T, K> mDao;


    public BaseBeanManager(AbstractDao dao) {
        mDao = dao;
    }


    public void save(T item) {
        mDao.insert(item);
    }

    public void save(T... items) {
        mDao.insertInTx(items);
    }

    public void save(List<T> items) {
        mDao.insertInTx(items);
    }

    public void saveOrUpdate(T item) {
        mDao.insertOrReplace(item);
    }

    public void saveOrUpdate(T... items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void saveOrUpdate(List<T> items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void deleteByKey(K key) {
        mDao.deleteByKey(key);
    }

    public void delete(T item) {
        mDao.delete(item);
    }

    public void delete(T... items) {
        mDao.deleteInTx(items);
    }

    public void delete(List<T> items) {
        mDao.deleteInTx(items);
    }

    public void deleteAll() {
        mDao.deleteAll();
    }


    public void update(T item) {
        mDao.update(item);
    }

    public void update(T... items) {
        mDao.updateInTx(items);
    }

    public void update(List<T> items) {
        mDao.updateInTx(items);
    }

    public T query(K key) {
        return mDao.load(key);
    }

    public List<T> queryAll() {
        return mDao.loadAll();
    }

    public List<T> query(String where, String... params) {

        return mDao.queryRaw(where, params);
    }

    public QueryBuilder<T> queryBuilder() {

        return mDao.queryBuilder();
    }

    public long count() {
        return mDao.count();
    }

    public void refresh(T item) {
        mDao.refresh(item);

    }

    public void detach(T item) {
        mDao.detach(item);
    }
}
public class StudentManager extends BaseBeanManager<Student, Long> {
    public StudentManager(AbstractDao dao) {
        super(dao);
    }
}
/**
 * green到数据库测试
 */
class GreenDaoTestActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_green_dao_test)
        initView()
    }

    private fun initView() {
        btnSave.setOnClickListener {
            saveStudent()
        }
        btnDelete.setOnClickListener {
            deleteStudent()
        }
        btnUpdate.setOnClickListener {
            updateStudent()
        }

        btnQuery.setOnClickListener {
            queryStudent()
        }
    }

    private fun saveStudent() {
        ManagerFactory.getInstance().studentManager.saveOrUpdate(Student("1", "杨洛峋", "5"))
    }

    private fun deleteStudent() {
        ManagerFactory.getInstance().studentManager.delete(Student("1","杨洛峋","5"))
    }

    private fun updateStudent() {
        ManagerFactory.getInstance().studentManager.update(Student("1", "杨洛峋小宝宝", "不到5岁"))
    }

    private fun queryStudent() {
        var list = ManagerFactory.getInstance().studentManager.queryAll()
        if (list != null && list.isNotEmpty()) {
            tvDaoContent.text = "${list[0].studentName}"
        } else {
            tvDaoContent.text = "数据库中 没有数据了"
        }

    }
}

 

三、小结

  以上是做的一个简单的测试。增删改查是没什么问题。要想在项目中愉快的使用,还需要进一步的做一下封装