其实工作以来,基本没跟数据库打过交道。今年年初,做一个项目,里面有数据持久化模块。当时尝试使用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 plugin
dependencies {
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;
@Entity
public 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;
@Entity
public 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;
@Override
public 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">
<EditText
android: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"/>
<EditText
android: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"/>
<EditText
android: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"/>
<EditText
android: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"/>
<Button
android: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"/>
<Button
android: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" />
<Button
android: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" />
<Button
android: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" />
<TextView
android: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();
@Override
protected 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);
}
@Override
public 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就非常好,为何一定要使用第三方的框架呢。随着自己在学习和工作中使用的框架越来越多,发现有些框架真的是非常不错的。