- [ 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的好处!