巧用工具封装属于自己的ORM框架【XutilsDbUtil】分装
**
作者前言
之前一直在CSDN上做潜水党伸手党,从来都是那种看别人的博客不回复,下载过来也不回复,研究老半天有些地方不理解还是不回复的人,但现在因为个人项目有点清闲了,公司项目也没有那么紧迫,所以过来发点东西,想让大家过来一起讨论讨论(好吧,就是没积分了)
直奔主题了,android的orm框架其实也不少,好像不少人使用的是greenDao,Ahibernate,还有…
其实我们有时候在用的工具也可以为我们提供很高效的工具,比如XUtils,这个工具jar大家应该都有用过,在网络的处理,图片的缓存下载上面性能是6的一匹啊,别忽略他的DbUtil,这个工具的使用方法,我认为比greenDao更加方便,性能上可能会逊一筹,为了写代码的方便,我们也是不顾一切了。
项目需要使用到一些orm的框架进行存储一些必要的数据,于是乎,我就分装这么一个基类方便大家进行本地数据库的开发:
**
import android.content.Context;
import com.lidroid.xutils.DbUtils;
import com.lidroid.xutils.DbUtils.DaoConfig;
public class DaoManager {
private static DbUtils db;
/**
*
* @param context
*/
public static void createDao(Context context, String Dbname) {
DaoConfig config = new DaoConfig(context);
config.setDbName(Dbname + ".db"); // db名
config.setDbVersion(1); // db版本
db = DbUtils.create(config);// db还有其他的一些构造方法,比如含有更新表版本的监听器的
}
/**
* 创建db实例
*
* @param context
* @return
*/
public static DbUtils getInstence(Context context, String Dbname) {
if (db == null) {
createDao(context, Dbname);
}
return db;
}
}
包名的话这边我就忽略了,项目要求。根据不同的需求,我们首先需要创建一个DbUtil的实例对象,并且配置它,因为我的项目中整合了聊天的需要,所以要对每一个用户的聊天数据库进行保存,我在这里把数据库名称也都抛给了下一个DAO基类
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import com.lidroid.xutils.DbUtils;
import com.lidroid.xutils.exception.DbException;
/**
*
* @author Chance
*
* 创建时间 下午2:48:18
*
* DAO层基类
*/
public abstract class BaseDao<T> {
public static DbUtils db;
private Class<T> clazz;
/**
* 创建得到DbUtil的管家
*
* @param context
*/
@SuppressWarnings("unchecked")
public BaseDao(Context context, String Dbname) {
db = DaoManager.getInstence(context, Dbname);
Type genType = this.getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
this.clazz = (Class<T>) params[0];
try {
createTable();
} catch (DbException e) {
e.printStackTrace();
}
}
/**
* 返回DbUtil管家
*
* @return
*/
public DbUtils getInstence() {
return db;
}
/**
* 创建表
*
* @throws DbException
*/
private void createTable() throws DbException {
db.createTableIfNotExist(clazz);
}
/**
* 保存一组数据
*
* @param list
* @throws DbException
*/
public void save(List<T> list) throws DbException {
if (list != null) {
for (T t : list) {
db.save(t);
}
}
}
/**
* 用来保存单个数据
*
* @param object
* @throws DbException
*/
public void save(T t) throws DbException {
if (t != null) {
db.save(t);
}
}
/**
* 查找并返回
*
* @return
* @throws DbException
*/
public List<T> findData() throws DbException {
List<T> list = new ArrayList<T>();
if (db != null) {
list = (List<T>) db.findAll(clazz);
}
return list;
}
/**
* 根据某一个String 的条件查找
*
* @param term
* @return
* @throws DbException
*/
public abstract T findData(String term) throws DbException;
/**
* 根据一个id 来查找
*
* @param id
* @return
* @throws DbException
*/
public T findData(int id) throws DbException {
T entity = (T) db.findById(clazz, id);
return entity;
}
/**
* 根据一个String查找并且修改语句
*
* @param term
* @return
*/
public abstract void updateData(String term);
/**
* 根据一个T泛型进行查找并且修改语句
*
* @param t
* @return
*/
public abstract void updateData(T t);
/**
* 根据id进行删除
*
* @param id
* @throws DbException
*/
public void deletData(int id) throws DbException {
db.deleteById(clazz, id);
}
/**
* 根据一些特定的值来 删除
*
* @param t
* @throws DbException
*/
public abstract void deletData(T t) throws DbException;
}
这里仅仅写了一些CRUD的还有一些必要查询操作,没有真正的实现,应为XUtils可以通过SQL语句进行数据库的操作,于是我也就抛给了子类去实现
import com.chance.model.NewFriendNotice;
import com.lidroid.xutils.db.sqlite.Selector;
import com.lidroid.xutils.exception.DbException;
import android.content.Context;
import android.text.TextUtils;
public class NewFriendDao extends BaseDao<NewFriendNotice> {
public NewFriendDao(Context context, String Dbname) {
super(context, Dbname);
}
@Override
public NewFriendNotice findData(String term) throws DbException {
NewFriendNotice notice = null;
if (!TextUtils.isEmpty(term)) {
notice = db.findFirst(Selector.from(NewFriendNotice.class).where(
"nickName", "=", term));
}
if (notice != null) {
return notice;
} else {
notice = new NewFriendNotice();
return notice;
}
}
@Override
public void updateData(String term) {
// TODO 自动生成的方法存根
}
@Override
public void updateData(NewFriendNotice t) {
// TODO 自动生成的方法存根
}
@Override
public void deletData(NewFriendNotice t) throws DbException {
// TODO 自动生成的方法存根
}
}
这是一个已经实现了的子类,可以看到这个基类中我们需要实现一种查询,两种更新,一个删除的方法,其实还有更好的解决方案,因为我为的是公司的项目需求,并没有做更多的拓展,也希望大家可以更加深入的研究,这里就不做再多的解释啦
public class MainActivity extends ActionBarActivity {
private Button btn_insert, btn_delet, btn_updata, btn_serch;
// private ContactsDao dao;
private NewFriendDao dao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// dao = new ContactsDao(getApplicationContext(), "chance");
dao = new NewFriendDao(getApplicationContext(), "chance");
initView();
initEvent();
}
....
/**
* 插入数据
*/
private void insertData() {
NewFriendNotice notice = new NewFriendNotice();
notice.setNickName("Chance");
notice.setTimeStamp("2015/8/8");
notice.setDeal(false);
try {
dao.save(notice);
} catch (DbException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
/**
* 查询语句
*/
private void searchData() {
try {
List<NewFriendNotice> list = dao.findData();
Toast.makeText(getApplicationContext(), list.toString(),
Toast.LENGTH_SHORT).show();
} catch (DbException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
简单的插入删除更改查询也都封装在Dao中,只要调用一下就好了,如果有复杂一些的操作,那么就getInstence()获取db的实例,使用Selector这个XUtils的静态方法进行更加高级的增删改查。
对了,还有一点需要提醒大家的是,在写entity的时候记得加上id字段,否则会报错哦!
然而在自己电脑的本地也还写很多小博客,未来也会陆续发布上来也大家进行共享!
【有什么意见的或者建议的请在下面流言哦,亲喷! - -!】