其实工作以来,基本没跟数据库打过交道。今年年初,做一个项目,里面有数据持久化模块。当时尝试使用GreenDao,但是由于公司不让使用外网,连导入GreenDao都很困难,所以,最后不得已使用了Sqlite原生api进行数据的增删改查。最近工作不是很忙,今天偷偷地学习了一下GreenDao的使用,下班回来抓紧总结一下。

其实,一直以来,我写博客都只是为了总结自己所学。假如你恰好看到了我的这篇文章,那么你肯定已经对主流的数据库框架做了调研和比较。我一向不会用太多的篇幅去介绍某某库好在哪里,毕竟我也只是在调研后的基础上,去总结如何使用这些框架。

一.GreenDao的配置

1.在Project的build.gradle中添加greendao插件的依赖:

buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.2.0'classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add  greendao-gradle plugin}}allprojects {repositories {google()jcenter()}}task clean(type: Delete) {delete rootProject.buildDir}

2.在module的build.gradle中引用greendao插件,导入greendao的依赖:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // add  greendao-gradle plugindependencies {implementation 'org.greenrobot:greendao:3.2.2' // add library
}

3.在module的build.gradle中配置greendao版本号等:

//greendao配置
greendao {schemaVersion 1//数据库版本号daoPackage 'com.example.tuduzhao.greendao'//设置DaoMaster、DaoSession、Dao包名targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}

二.GreenDao的使用

1.创建存储对象实体类:

package com.example.tuduzhao.greendaodemo;import org.greenrobot.greendao.annotation.Entity;import org.greenrobot.greendao.annotation.Id;@Entitypublic class User {@Id(autoincrement = true)private Long id;private String name;private int age;private String address;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}

2.Build一下,在targetGenDir生成相应包名下的三个文件(DaoMaster,DaoSession,UserDao)。Build后,存储实体类会自动生成构造方法,build后的User类:

package com.example.tuduzhao.greendaodemo;import org.greenrobot.greendao.annotation.Entity;import org.greenrobot.greendao.annotation.Id;import org.greenrobot.greendao.annotation.Generated;@Entitypublic class User {@Id(autoincrement = true)private Long id;private String name;private int age;private String address;@Generated(hash = 467157864)public User(Long id, String name, int age, String address) {this.id = id;this.name = name;this.age = age;this.address = address;}@Generated(hash = 586692638)public User() {}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}

3.自定义Application(记得在Manifest中配置),初始化GreenDao:

package com.example.tuduzhao.greendaodemo;import android.app.Application;
import android.database.sqlite.SQLiteDatabase;import com.example.tuduzhao.greendao.DaoMaster;
import com.example.tuduzhao.greendao.DaoSession;public class MyApplication extends Application {private DaoSession mDaoSession;@Overridepublic void onCreate() {super.onCreate();initGreenDao();}/*** 初始化GreenDao,直接在Application中进行初始化操作*/private void initGreenDao() {DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "aserbao.db");SQLiteDatabase db = helper.getWritableDatabase();DaoMaster daoMaster = new DaoMaster(db);mDaoSession = daoMaster.newSession();}public DaoSession getDaoSession() {return mDaoSession;}
}

三.GreenDao进行增删改查

1.增

//插入数据
private void insertUser(long id, String name, int age, String address) {User user = new User(id, name, age, address);mDaoSession.getUserDao().insertOrReplace(user);//如果ID已经存在,则替换
}

2.删

//删除数据
private void deleteUser(long id) {User user = mDaoSession.getUserDao().load(id);if (user != null) {//存在数据才进行删除操作mDaoSession.getUserDao().deleteByKey(id);} else {Toast.makeText(this, "要删除的ID不存在", Toast.LENGTH_SHORT).show();}}

3.改

//更新数据
private void updateUser(long id, String name, int age, String address) {User user = mDaoSession.getUserDao().load(id);if (user != null) { //存在数据才进行更新操作user.setName(name);user.setAge(age);user.setAddress(address);mDaoSession.getUserDao().update(user);} else {Toast.makeText(this, "要更新的ID不存在", Toast.LENGTH_SHORT).show();}}

4.查

//查询数据
private void queryUser() {List<User> userList = mDaoSession.getUserDao().loadAll(); //查询所有for (User user : userList) {queryResult.append("id:" + user.getId() + "    ");queryResult.append("name:" + user.getName() + "    ");queryResult.append("age:" + user.getAge() + "    ");queryResult.append("address:" + user.getAddress() + "\n\r"); //换行}
}

四.项目文件

1.布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><EditTextandroid:id="@+id/id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="ID"android:lines="1"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toLeftOf="@+id/name"/><EditTextandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="名字"android:lines="1"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toRightOf="@+id/id"app:layout_constraintRight_toLeftOf="@+id/age"/><EditTextandroid:id="@+id/age"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="年龄"android:lines="1"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toRightOf="@+id/name"app:layout_constraintRight_toLeftOf="@+id/address"/><EditTextandroid:id="@+id/address"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="地址"android:lines="1"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toRightOf="@+id/age"app:layout_constraintRight_toRightOf="parent"/><Buttonandroid:id="@+id/add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="增"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@id/name"app:layout_constraintRight_toLeftOf="@+id/delete"/><Buttonandroid:id="@+id/delete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="删"app:layout_constraintLeft_toRightOf="@+id/add"app:layout_constraintRight_toLeftOf="@+id/update"app:layout_constraintTop_toBottomOf="@id/name" /><Buttonandroid:id="@+id/update"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="改"app:layout_constraintLeft_toRightOf="@+id/delete"app:layout_constraintRight_toLeftOf="@+id/query"app:layout_constraintTop_toBottomOf="@id/name" /><Buttonandroid:id="@+id/query"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="查"app:layout_constraintLeft_toRightOf="@+id/update"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/name" /><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="18sp"app:layout_constraintTop_toBottomOf="@+id/add"/>
</android.support.constraint.ConstraintLayout>

2.MainActivity文件:

package com.example.tuduzhao.greendaodemo;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import com.example.tuduzhao.greendao.DaoSession;import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener {//四个输入框private EditText id;private EditText name;private EditText age;private EditText address;//四个按钮private Button add;private Button delete;private Button update;private Button query;//输入的内容private String mId;private String mName;private String mAge;private String mAddress;//展示查询结果private TextView tv;private DaoSession mDaoSession;//查询结果StringBuffer queryResult = new StringBuffer();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();mDaoSession = MyApplication.getDaoSession();}//初始化控件private void initView() {id = findViewById(R.id.id);name = findViewById(R.id.name);age = findViewById(R.id.age);address = findViewById(R.id.address);add = findViewById(R.id.add);delete = findViewById(R.id.delete);update = findViewById(R.id.update);query = findViewById(R.id.query);add.setOnClickListener(this);delete.setOnClickListener(this);update.setOnClickListener(this);query.setOnClickListener(this);tv = findViewById(R.id.tv);}@Overridepublic void onClick(View v) {getEditTextContent();switch (v.getId()) {//增删改操作时ID不能为空case R.id.add:if (mId.equals("")) {Toast.makeText(this, "ID不能为空", Toast.LENGTH_SHORT).show();} else {insertUser(Long.parseLong(mId), mName, Integer.parseInt(mAge.equals("") ? "0" : mAge), mAddress);updateQueryResult();}break;case R.id.delete:if (mId.equals("")) {Toast.makeText(this, "请输入要删除的ID", Toast.LENGTH_SHORT).show();} else {deleteUser(Long.parseLong(mId));updateQueryResult();}break;case R.id.update:if (mId.equals("")) {Toast.makeText(this, "请输入要更新的ID", Toast.LENGTH_SHORT).show();} else {updateUser(Long.parseLong(mId), mName, Integer.parseInt(mAge.equals("") ? "0" : mAge), mAddress);updateQueryResult();}break;case R.id.query:updateQueryResult();break;}}//获取输入框的内容private void getEditTextContent() {mId = id.getText().toString();mName = name.getText().toString();mAge = age.getText().toString();mAddress = address.getText().toString();}//在增删改操作后查询并更新UI状态private void updateQueryResult() {if (!queryResult.equals("")) {queryResult = new StringBuffer();}queryUser();tv.setText(queryResult);}//插入数据private void insertUser(long id, String name, int age, String address) {User user = new User(id, name, age, address);mDaoSession.getUserDao().insertOrReplace(user);//如果ID已经存在,则替换}//删除数据private void deleteUser(long id) {User user = mDaoSession.getUserDao().load(id);if (user != null) {//存在数据才进行删除操作mDaoSession.getUserDao().deleteByKey(id);} else {Toast.makeText(this, "要删除的ID不存在", Toast.LENGTH_SHORT).show();}}//更新数据private void updateUser(long id, String name, int age, String address) {User user = mDaoSession.getUserDao().load(id);if (user != null) { //存在数据才进行更新操作user.setName(name);user.setAge(age);user.setAddress(address);mDaoSession.getUserDao().update(user);} else {Toast.makeText(this, "要更新的ID不存在", Toast.LENGTH_SHORT).show();}}//查询数据private void queryUser() {List<User> userList = mDaoSession.getUserDao().loadAll(); //查询所有for (User user : userList) {queryResult.append("id:" + user.getId() + "    ");queryResult.append("name:" + user.getName() + "    ");queryResult.append("age:" + user.getAge() + "    ");queryResult.append("address:" + user.getAddress() + "\n\r"); //换行}}
}

五.经验总结

1.在build后又修改实体类后导致的错误:

解决方法:

删除@Generated后面的括号部分,重新build:

@Generated(hash = 467157864)

2.build时实体类生成构造函数时是根据定义的变量的顺序

最后,总结一下吧。通过我自己的学习和使用,我真的体会到了,GreenDao是一个非常不错的数据库框架。对于数据的增删改查的操作非常的方便,上手也挺快的。其实我是一个不太想接触新技术的人,我总觉得Android原生的API就非常好,为何一定要使用第三方的框架呢。随着自己在学习和工作中使用的框架越来越多,发现有些框架真的是非常不错的。

Android最火的框架系列(五)GreenDao相关推荐

  1. Android最火的框架系列(四)Volley

    其实,本来不想写Volley的,由于前面写了一篇如何使用Eclipse搭建Android服务端的博客,今天,我们尝试用Volley去访问一下.其实,Volley已经不算是很火的网络请求框架了,Voll ...

  2. android编译时注解,Android编译时注解框架系列2-Run Demo

    概述 先讲一下编写<Android编译时注解框架>的初衷吧,APT其实并不难,可以说是简单且高效,但关于APT的资料却并不多,甚至很多人都不知道这么一个技术.国内关于APT的博客屈指可数, ...

  3. 从零开始搭建Android框架系列

    原文链接:http://www.jianshu.com/nb/3767449 开篇介绍和工程目录结构[从零开始搭建android框架系列(1)] 不容错过,最全的安卓架构合集[从零开始搭建androi ...

  4. 连接真机开发安卓(Android)移动app MUI框架 完善购物车订单等页面——混合式开发(五)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 这周真的太忙了,就 ...

  5. 【转】Android 最火框架XUtils之注解机制详解

    原文:http://blog.csdn.net/rain_butterfly/article/details/37931031 在上一篇文章Android 最火的快速开发框架XUtils中简单介绍了x ...

  6. Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  7. Android 开发 框架系列 百度语音合成

    Android 开发 框架系列 百度语音合成 官方文档:http://ai.baidu.com/docs#/TTS-Android-SDK/6d5d6899 官方百度语音合成控制台:https://c ...

  8. Android图片加载框架最全解析(五)

    由此我们可以得知,在没有明确指定的情况下,ImageView默认的scaleType是FIT_CENTER. 有了这个前提条件,我们就可以继续去分析Glide的源码了.当然,本文中的源码还是建在第二篇 ...

  9. Android 2018优秀开源框架整理收藏

    中级.高级.资深工程师 知其然知其不可然 <框架百大排行榜>里所提到的流行词.流行术语--使用能力.融会贯通其原理.讲解框架能力的高低,将让你不断的在这三个级别徘徊: 会有意识的合并榜单里 ...

最新文章

  1. TensorFlow迁移学习的识别花试验
  2. python快捷键设置_UltraEdit搭建Python IDE环境+设置快捷键
  3. python六十四课——高阶函数练习题(一)
  4. 漫画-Linux中断子系统综述
  5. java先执行static还是构造函数_【Java基础】类的实例化、static、父类构造函数执行顺序...
  6. mybatis 注解 动态SQL
  7. Mysql多表关联查询
  8. linux grub内核选择,UBUNTU GRUB没有内核选项,怎么回事啊?
  9. Java软件开发中,常用的工具有哪些?
  10. web安全day37:Linux脚本判断和循环,编写脚本实现内网主机存活批量检测
  11. MariaDB和MySQL性能测试比较
  12. Linux服务之DNS服务篇
  13. python入侵电脑教程_Python外星人入侵问题求助?python网站入侵视频教程
  14. linux(计划任务)
  15. 写简历的大原则和投简历的小技巧
  16. 程序员必备技能之上传代码(Github篇)
  17. VSCode搭建STM32开发环境
  18. 智慧物业小程序_物业小程序 物业管理小程序 微信物业小程序
  19. 脆弱性和安全风险分析
  20. python打包和添加数据文件_python库打包分发setup.py编写指南

热门文章

  1. 云主机磁盘存储动态扩容(LVM)方案
  2. 80老翁谈人生(347):老翁因火星人失窃源代码与方正结成“死结“
  3. python win32gui+pynput 自动回复qq消息
  4. CodeForces - 1646E Power Board (思维,数学)
  5. mysql association_MyBatis association的两种形式——MyBatis学习笔记之四
  6. mysql 导出dmp文件_Linux环境下使用crontab实现mysql定时备份
  7. MySQL数据库修改名称的三种方法
  8. 感知机算法(一)---原理
  9. PHP 笔试 + 面试题
  10. 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(五)