Android最火的框架系列(五)GreenDao

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个玩游戏的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值