巧用工具封装属于自己的ORM框架【XutilsDbUtil】分装

巧用工具封装属于自己的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字段,否则会报错哦!

然而在自己电脑的本地也还写很多小博客,未来也会陆续发布上来也大家进行共享!
【有什么意见的或者建议的请在下面流言哦,亲喷! - -!】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值