Android MVPBuilder第四篇[GreenDao的使用]

本文介绍如何在Android项目中结合MVP架构使用GreenDao进行数据库操作。通过一个简单的增删改查需求,展示了V(View)和P(Presenter)职责的划分,强调了MVP模式的优点——解耦合和易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

- [ MVPBuilder Github 下载地址]

今天我们学习GreenDao的使用,上一篇只是把greendao引进来,还没有示例一下怎么用。其实最好的教程就是官网,下面也贴一下官网地址:

- [ GreenDao 官网]

回顾一下上一篇的目录,红框内是ORM框架生成的。
这里写图片描述
上一篇用的是GreenDao2,现在已经是GreenDao3了,所以赶紧升级。3和2最大的区别就是增加了注解,具体看官网。来看看我们今天的工程目录:
这里写图片描述

框框比较多,但是别怕。我们结合MVP一起来把这个使用例子写出来。

情景假设

需求描述:主页(MainActivity)有一个按钮,点击跳转到GreenDao的使用例子页面(DBExampleActivity),DBExampleActivity页面有三个按钮,分别是增,删,改,每次增删改操作都会把数据库里的数据显示到顶部(查)。OK,需求简单,立马开工,注意,现在有V,P两名员工,分别负责界面和业务逻辑开发,他们都清楚需求了。
P说:你要增删改查数据库,那我给你insert,del,update,query方法,至于怎样增删改你不用管,你要增删改的时候调用他们就行了。
V说:行,我也不想知道你怎样增删改查。这样,你要刷新页面的时候就调用showDBResult这个方法,页面怎样更新与你无关。
说罢,各自开干,先把方法写出来给对方。
V定义了一个这样的IDBExampleActivity接口:

package com.yihukurama.www.mvpbuilder.framework.v.interfaceView;

/**
 * Created by dengshuai on 16/7/25.
 */
public interface IDBExampleActivity extends IActivity{
    void showDBResult();//把数据库的操作结果显示
}

P定义了一个IDB接口:

package com.yihukurama.www.mvpbuilder.framework.p.interfacePresenter;

import java.util.List;

/**
 * Created by dengshuai on 16/7/25.
 */
public interface IDB {
    void insert();
    void del();
    void update();
    List query();
}

然后V,P两名员工把接口丢给对方。


V员工的工作

V继续开发,MainActivity是现成的,写写按钮控件,很快就出来了

package com.yihukurama.www.mvpbuilder.framework.v;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.yihukurama.www.mvpbuilder.R;
import com.yihukurama.www.mvpbuilder.framework.v.activity.BaseActivity;
import com.yihukurama.www.mvpbuilder.framework.v.activity.DBExampleActivity;
import com.yihukurama.www.mvpbuilder.framework.v.interfaceView.IMainActivity;

public class MainActivity extends BaseActivity implements IMainActivity,View.OnClickListener{

    Button btnDB;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();
    }


    @Override
    public void initView() {
        btnDB = (Button)findViewById(R.id.dbBtn);
        btnDB.setOnClickListener(this);
    }

    @Override
    public void initData() {

    }

    @Override
    public void onClick(View v) {
        super.onClick(v);
        switch (v.getId()){
            case R.id.dbBtn:
                Intent intent = new Intent(this, DBExampleActivity.class);
                startActivity(intent);
                finish();
                break;

            default:
                break;
        }
    }
}

然后写DBExampleActivity

package com.yihukurama.www.mvpbuilder.framework.v.activity;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.yihukurama.www.mvpbuilder.R;
import com.yihukurama.www.mvpbuilder.framework.m.dao.bean.User;
import com.yihukurama.www.mvpbuilder.framework.p.DBP;
import com.yihukurama.www.mvpbuilder.framework.p.interfacePresenter.IDB;
import com.yihukurama.www.mvpbuilder.framework.v.interfaceView.IDBExampleActivity;

import java.util.List;

public class DBExampleActivity extends AppCompatActivity implements IDBExampleActivity, View.OnClickListener{

    IDB p;
    Button iBtn;
    Button dBtn;
    Button uBtn;
    TextView tx;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_db);

        initView();
        initData();
    }

    @Override
    public void initView() {
        iBtn = (Button)findViewById(R.id.insertBtn);
        dBtn = (Button)findViewById(R.id.delBtn);
        uBtn = (Button)findViewById(R.id.updateBtn);
        tx = (TextView)findViewById(R.id.dbresult); 
        iBtn.setOnClickListener(this);
        dBtn.setOnClickListener(this);
        uBtn.setOnClickListener(this);
    }

    @Override
    public void initData() {
        //这里暂时是空的,要等P告诉我是什么类才写
        p = new DBP(this);
    }

    @Override
    public Context getContext() {
        return this;
    }


    @Override
    public void showDBResult() {
        List<User> users = p.query();
        String result ="数据库数据\n";
        for (User user:users
             ) {
            result=result+" "+user.getName()+"\n";
        }
        tx.setText(result);

    }

    //调用P给我的接口
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.insertBtn:
                p.insert();
                break;
            case R.id.delBtn:
                p.del();
                break;
            case R.id.updateBtn:
                p.update();
                break;
            default:
                break;
        }
    }
}

V写完了跑去问P:P哥,你的数据库难写吧?写好没有啊。
没想到P早就坐着在喝茶了:正等着你呢,Presenter的实例叫DBP,拿去用。
然后V飞奔回去补上 p = new DBP(this); 这段代码。还偷偷看了P写的其它代码,纳闷数据库操作不是很多sql语句吗,这么快就写好了。只见P写了这么些代码。


P的代码DBP

package com.yihukurama.www.mvpbuilder.framework.p;

import com.yihukurama.www.mvpbuilder.framework.m.dao.bean.User;
import com.yihukurama.www.mvpbuilder.framework.p.interfacePresenter.IDB;
import com.yihukurama.www.mvpbuilder.framework.v.interfaceView.IDBExampleActivity;
import com.yihukurama.www.mvpbuilder.opensource.api.DaoApi;
import com.yihukurama.www.mvpbuilder.opensource.greendao.UserDao;

import org.greenrobot.greendao.query.Query;

import java.util.List;

/**
 * Created by dengshuai on 16/7/25.
 */
public class DBP implements IDB{
    User user;
    IDBExampleActivity v;
    DaoApi daoApi;

    public DBP(IDBExampleActivity v){
        this.v = v;
        daoApi = DaoApi.getInstance(v.getContext());
    }
    @Override
    public void insert() {
        //例子,直接new一个User实例插入
        User user1 = new User();
        user1.setName("方法里定义的user");
        user1.setOid("1");
        user1.setSex("男");
        daoApi.getDaoSession().getUserDao().insert(user1);
        //再插入一个成员变量
        user = new User();
        user.setName("Persenter定义的user");
        user.setOid("2");
        user.setSex("男");
        daoApi.getDaoSession().getUserDao().insert(user);
        v.showDBResult();
    }

    @Override
    public void del() {
        daoApi.getDaoSession().getUserDao().deleteAll();
        v.showDBResult();
    }

    @Override
    public void update() {
        user.setName("Persenter定义的user更新名字了");
        daoApi.getDaoSession().getUserDao().update(user);
        v.showDBResult();
    }

    @Override
    public List query() {
        Query query = daoApi.getDaoSession().getUserDao().queryBuilder().where(
                UserDao.Properties.Sex.eq("男"))
                .build();
        List<User> users = query.list();
        return users;
    }
}

原来核心就是daoApi.getDaoSession().getUserDao().数据库操作,然后下一句刷新页面这么简单,看来GreenDao真实个好东西!

总结:P和V完全不在意对方代码细节,并且两人不会在同一个文件做更改,这样避免了不懂对方代码逻辑而误删的尴尬局面,又让各自工作明确,某天如果不用greendao了,activity什么都不用改,某天要美化activity,业务逻辑也什么都不用改。这就是MVP的好处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值