Orm框架之XUtils简单使用

今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示。相信大家对这个框架也都了解过,下面简单介绍下XUtils3的一些基本知识。 
XUtils3一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。 
使用XUtils只需要在libs文件夹里面加入一个jar包,如果对服务器返回的数据进行封装的话,还需要导入一个Gson的jar包。 
所需权限:
 


1. 注解模块

Activity的注解 
1.在Application的oncreate方法中加入下面代码: 
x.Ext.init(this); 
2.在Activity的oncreate方法中加入下面代码: 
x.view().inject(this); 
3.加载当前的Activity布局需要如下注解: 
@ContentView加入到Activity的上方 
4.给View进行初始化需要如下注解: 
@InjectView 
5.处理控件的各种响应事件需要如下注解: 
@Envent 
示例如下:

    @ContentView(R.layout.activity_main)
public class MainActivity extends ActionBarActivity {

    @ViewInject(R.id.btn_get)
    Button btn_get;
    @ViewInject(R.id.btn_post)
    Button btn_post;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);
        btn_get.setText("发送get请求");
        btn_post.setText("发送post请求");
    }
    //等同于@Event(value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class)
    @Event(value={R.id.btn_get,R.id.btn_post})
    private void getEvent(View view){
        switch(view.getId()){
        case R.id.btn_get:
            Toast.makeText(MainActivity.this, btn_get.getText().toString().trim(), 0).show();
            break;
        case R.id.btn_post:
            Toast.makeText(MainActivity.this, btn_post.getText().toString().trim(), 0).show();
            break;
        }
    }


通过测试,我们发现当点击btn_get按钮时,弹出了“发送get请求”的效果。到这里,大家算是对XUtils的注解有个一个基本的认识,下面我在强调一点的是,@Event这个注解默认情况下type属性为View.OnClickListener.class.如果你想实现其余点击事件效果,只需要把type值进行修改即可。 
另外需要注意的一点是按钮的点击事件必须用private进行修饰。

Fragment的注解:

@ContentView(R.layout.fragment_first)  
public class FirstFragment extends Fragment{  
    private MyAdapter adapter;
    private List list=new ArrayList<>();  
    private List listUrl=new ArrayList<>();  
    private List listName=new ArrayList<>();    

    @ViewInject(R.id.btn_test)
    Button btn_test;
    @ViewInject(R.id.listView)
    ListView listView;

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return  x.view().inject(this, inflater, container);
    } 

ViewHolder的注解:

    public class MyAdapter extends  BaseAdapter{
    private Context context;
    private List list;
    private LayoutInflater mInflater;
    private ImageOptions options;
    public ViewHolder holder;
    public MyAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
        this.mInflater=LayoutInflater.from(context);
        options=new ImageOptions.Builder().setLoadingDrawableId(R.drawable.ic_launcher)
                .setLoadingDrawableId(R.drawable.ic_launcher).setUseMemCache(true).setCircular(true).build();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        holder=null;
        if(convertView==null){
            convertView=mInflater.inflate(R.layout.itemone, null);
            holder=new ViewHolder();
            x.view().inject(holder,convertView);
            convertView.setTag(holder);
        }
        else{
            holder=(ViewHolder) convertView.getTag();
        }
        Person bean=list.get(position);
        holder.tv_name.setText(bean.getName());
        x.image().bind(holder.iv_image, bean.getImgUrl(), options);
        return convertView;
    }

    class ViewHolder{
        @ViewInject(R.id.tv_name)
        private TextView tv_name;
        @ViewInject(R.id.iv_image)
        private ImageView iv_image;
    }

上面的代码是注解ViewHolder的标准模式,相信大家完全能够看明白。这里我加载图片使用到了XUtils3的加载网络图片的方法。后面我会详细进行讲解。


2.网络模块

XUtils的网络请求方法和一些网络请求框架的用法非常类似,我进行了一些简单的封装。 
封装一共有3个文件,分别是网络请求工具类XUtil,请求响应数据的解析类,还有一个就是一个请求成功的一个接口回调类。 
代码如下:

public class XUtil {
    /**
     * 发送get请求
     * @param
     */
    public static Cancelable Get(String url,Map map,CommonCallback callback){
        RequestParams params=new RequestParams(url);
        if(null!=map){
            for(Map.Entry entry : map.entrySet()){
                params.addQueryStringParameter(entry.getKey(), entry.getValue());
            }
        }
        Cancelable cancelable = x.http().get(params, callback);
        return cancelable;
    }

    /**
     * 发送post请求
     * @param
     */
    public static Cancelable Post(String url,Map map,CommonCallback callback){
        RequestParams params=new RequestParams(url);
        if(null!=map){
            for(Map.Entry entry : map.entrySet()){
                params.addParameter(entry.getKey(), entry.getValue());
            }
        }
        Cancelable cancelable = x.http().post(params, callback);
        return cancelable;
    }

    /**
     * 上传文件
     * @param
     */
    public static Cancelable UpLoadFile(String url,Map map,CommonCallback callback){
        RequestParams params=new RequestParams(url);
        if(null!=map){
            for(Map.Entry entry : map.entrySet()){
                params.addParameter(entry.getKey(), entry.getValue());
            }
        }
        params.setMultipart(true);
        Cancelable cancelable = x.http().post(params, callback);
        return cancelable;
    }

    /**
     * 下载文件
     * @param
     */
    public static Cancelable DownLoadFile(String url,String filepath,CommonCallback callback){
        RequestParams params=new RequestParams(url);
        //设置断点续传
        params.setAutoResume(true);
        params.setSaveFilePath(filepath);
        Cancelable cancelable = x.http().get(params, callback);
        return cancelable;
    }
}

public class JsonResponseParser implements ResponseParser {
    //检查服务器返回的响应头信息
    @Override
    public void checkResponse(UriRequest request) throws Throwable {
    }

    /**
     * 转换result为resultType类型的对象
     *
     * @param resultType  返回值类型(可能带有泛型信息)
     * @param resultClass 返回值类型
     * @param result      字符串数据
     * @return
     * @throws Throwable
     */
    @Override
    public Object parse(Type resultType, Class resultClass, String result) throws Throwable {
        return new Gson().fromJson(result, resultClass);
    }
}

public class MyCallBack implements Callback.CommonCallback{

    @Override
    public void onSuccess(ResultType result) {
        //可以根据公司的需求进行统一的请求成功的逻辑处理
    }

    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
        //可以根据公司的需求进行统一的请求网络失败的逻辑处理
    }

    @Override
    public void onCancelled(CancelledException cex) {
    }

    @Override
    public void onFinished() {
    }
}

(1)发送get请求示例:

//本get请求来自于免费测试接口:http://www.k780.com/api/entry.baidu
String url="http://api.k780.com:88/?app=idcard.get";
        Map map=new HashMap<>();
        map.put("appkey", "10003");
        map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
        map.put("format", "json");
        map.put("idcard", "110101199001011114");
        XUtil.Get(url, map, new MyCallBack(){


            @Override
            public void onSuccess(PersonInfoBean result) {
                super.onSuccess(result);
                Log.e("result", result.toString());
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);
            }
        });

(2)发送post请求

String url="http://api.k780.com:88/?app=idcard.get";
        Map map=new HashMap<>();
        map.put("appkey", "10003");
        map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
        map.put("format", "json");
        map.put("idcard", "110101199001011114");
        XUtil.Post(url, map, new MyCallBack(){

            @Override
            public void onSuccess(PersonInfoBean result) {
                super.onSuccess(result);
                Log.e("result", result.toString());
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);
            }
        });


(3)上传文件

/**
     * 上传文件(支持多文件上传)
     */
    private void uploadfile() {
        //图片上传地址
        String url="";
        Map map=new HashMap<>();
        //传入自己的相应参数
        //map.put(key, value);
        //map.put(key, value);
        XUtil.UpLoadFile(url, map, new MyCallBack(){

            @Override
            public void onSuccess(String result) {
                super.onSuccess(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);
            }
        });
    }


(4)下载文件

private void downloadfile() {
        //文件下载地址
        String url="";
        //文件保存在本地的路径
        String filepath="";
        XUtil.DownLoadFile(url, filepath,new MyCallBack(){
            @Override
            public void onSuccess(File result) {
                super.onSuccess(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);
            }
        });


(5)下载文件带进度条

private void downloadprogressfile() {
        //文件下载地址
        String url="";
        //文件保存在本地的路径
        String filepath="";
        XUtil.DownLoadFile(url, filepath,new MyProgressCallBack(){

            @Override
            public void onSuccess(File result) {
                super.onSuccess(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);

            }
            @Override
            public void onLoading(long total, long current,
                    boolean isDownloading) {
                super.onLoading(total, current, isDownloading);
            }
        });
    }


(6)发送get请求(服务器以xml格式返回)

private void getxml() {
        String url="http://flash.weather.com.cn/wmaps/xml/china.xml";
        XUtil.Get(url, null, new MyCallBack(){

            @Override
            public void onSuccess(String xmlString) {
                super.onSuccess(xmlString);
                try{
                    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
                    XmlPullParser xmlPullParser = factory.newPullParser();  
                    xmlPullParser.setInput(new StringReader(xmlString));  
                    int eventType = xmlPullParser.getEventType();  
                    while (eventType != XmlPullParser.END_DOCUMENT) {  
                        switch (eventType) {  
                        case XmlPullParser.START_TAG:  
                            String nodeName = xmlPullParser.getName();  
                            if ("city".equals(nodeName)) {  
                                String pName = xmlPullParser.getAttributeValue(0);  
                                Log.e("TAG", "city is " + pName);  
                            }  
                            break;  
                        }  
                        eventType = xmlPullParser.next();  
                    }  
                }catch(Exception e){
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);
            }
        });
    }


3.图片加载模块

用法:
x.image().bind(imageView, url, imageOptions);
x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
x.image().bind(imageView, "assets://test.gif", imageOptions);
x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback() {...});
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback() {...});
x.image().loadFile(url, imageOptions, new Callback.CommonCallback() {...});

Xutils3的api还是比较简单的,相信大家都可以看懂,第一个参数传入一个View,第二个参数传入一个图片的网络地址,第三个参数一般是加载图片的配置。 
下面看一下ImageOptions这个类吧:

ImageOptions options=new ImageOptions.Builder()
//设置加载过程中的图片
.setLoadingDrawableId(R.drawable.ic_launcher)
//设置加载失败后的图片
.setFailureDrawableId(R.drawable.ic_launcher)
//设置使用缓存
.setUseMemCache(true)
//设置显示圆形图片
.setCircular(true)
//设置支持gif
.setIgnoreGif(false)
.build();

其余的一些配置请参考源码
如果需要对加载的图片进行操作的话,可以使用:

x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback() {...});
通过返回的Drawable对象进行图片的处理,满足项目的个性化的要求.

说了这么多,我想大家至少会对XUtils3有了一个基本的了解,由于XUtils3的数据库的用法比较多,本篇文章不会去涉及,下一篇文章我会为大家详细讲解XUtils3的数据库模块。大家赶紧现在动手操作一下吧!本文涉及到的所有实例都会在下面的demo中有涉及到,请自行参考。


4.数据库模块

如何导入SDK我就不说了,先从初始化说起。一般三方的东西最好都是在application里面完成,代码如下:

[java]  view plain  copy
 print ?
  1.  daoConfig = new DbManager.DaoConfig()  
  2.                 .setDbName("iDEvent.db")//设置数据库名称  
  3.                         // 不设置dbDir时, 默认存储在app的私有目录.  
  4.                 .setDbDir(new File("sdcard/SitSmice/iDEvent/DownLoad/dbPath")) // 数据库存储路径  
  5.                 .setDbVersion(1)//设置数据库版本  
  6.                 .setDbOpenListener(new DbManager.DbOpenListener() {  
  7.                     @Override  
  8.                     public void onDbOpened(DbManager db) {  
  9.                         // 开启WAL, 对写入加速提升巨大  
  10.                         db.getDatabase().enableWriteAheadLogging();  
  11.                     }  
  12.                 })  
  13. //                .setDbUpgradeListener(new DbManager.DbUpgradeListener() {  
  14. //                    @Override  
  15. //                    public void onUpgrade(DbManager db, int oldVersion, int newVersion) {  
  16. //                        // TODO: ...  
  17. //                        try {  
  18. //                            db.addColumn(Sign.class,"test");  
  19. //                        } catch (DbException e) {  
  20. //                            MLog.e("test","数据库更新失败");  
  21. //                            e.printStackTrace();  
  22. //                        }  
  23. //                        // db.dropTable(...);  
  24. //                        // ...  
  25. //                        // or  
  26. //                        // db.dropDb();  
  27. //                    }  
  28. //                })  
  29.         ;  
  30.         //db还有其他的一些构造方法,比如含有更新表版本的监听器的  
  31.         db = x.getDb(daoConfig);//获取数据库单例  
[java]  view plain  copy
 print ?
  1. 需要注意的是,我这里把那个监听数据库升级的监听屏蔽了,一般升级数据不需要特殊处理的话最好不要设置监听;正常升级数据库的方法是:比如你的app第一版数据库版本设置的是1,如果第二版数据库字段有变动,那就直接把版本设置成2就可以了,但是这样会删除你app里面的数据库,看监听源码得知:  
[java]  view plain  copy
 print ?
  1. public synchronized static DbManager getInstance(DaoConfig daoConfig) {  
  2.   
  3.        if (daoConfig == null) {//使用默认配置  
  4.            daoConfig = new DaoConfig();  
  5.        }  
  6.   
  7.        MyDbBase dao = DAO_MAP.get(daoConfig);  
  8.        if (dao == null) {  
  9.            dao = new MyDbBase(daoConfig);  
  10.            DAO_MAP.put(daoConfig, dao);  
  11.        } else {  
  12.            dao.daoConfig = daoConfig;  
  13.        }  
  14.   
  15.        // update the database if needed  
  16.        SQLiteDatabase database = dao.database;  
  17.        int oldVersion = database.getVersion();  
  18.        int newVersion = daoConfig.getDbVersion();  
  19.        if (oldVersion != newVersion) {  
  20.            if (oldVersion != 0) {  
  21.                DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener();  
  22.                if (upgradeListener != null) {//如果你不想删除之前app里面的数据,那就可以设置监听,在监听里面将之前表数据拷贝到新的表里面就可以了  
  23.                    upgradeListener.onUpgrade(dao, oldVersion, newVersion);  
  24.                } else {  
  25.                    try {  
  26.                        dao.dropDb();//如果设置了监听,那就直接删除了数据库,之前保存的数据就没有了  
  27.                    } catch (DbException e) {  
  28.                        LogUtil.e(e.getMessage(), e);  
  29.                    }  
  30.                }  
  31.            }  
  32.            database.setVersion(newVersion);  
  33.        }  
  34.   
  35.        return dao;  
  36.    }  

 
  这里插个小曲:xutils3主要看两个类Dbmanger和DbmangerImpl,从名称就能看出来,前者是管理类,用于初始化数据库操作的接口类,后者是相对应的实现类。想研究源码的同学可以去DbmangerImpl好好学习一下。 
  

接下来就是创建一张表了,代码如下:

[java]  view plain  copy
 print ?
  1. @Table(name = "test")//表名  
  2. public class Test {  
  3.   
  4.     /**  
  5.      * isId = true 代表该字段是这张表的主键,类型也可以是String (赋值为false就不是主键了),虽然数据库表可以设置多个主键,但是在实际操作的时候还是设置一个      * "font-family: Arial, Helvetica, sans-serif;">主键最好,小弟设置过两个主键,但是并没有达到我想要的效果  
[java]  view plain  copy
 print ?
  1.  * autoGen = true 代表主键自增长,如果不是自增长,那就赋值false (这里主键是否自增长很关键,会影响到后面数据库的操作,下面再结合方法来解释)  
  2.  */  
  3. @Column(name = "_id",isId = true,autoGen = true)  
  4. public int _id;  
  5.   
  6. @Column(name = "column1")//字段名称1  
  7. public String column1;  
  8.   
  9. @Column(name = "column2")//字段名称2  
  10. public String column2;  
  11.   
  12. @Column(name = "column3")//字段名称3  
  13. public String column3;  
  14.   
  15. @Override  
  16. public String toString() {  
  17.     return "Test{" +  
  18.             "_id=" + _id +  
  19.             ", column1='" + column1 + '\'' +  
  20.             ", column2='" + column2 + '\'' +  
  21.             ", column3='" + column3 + '\'' +  
  22.             '}';  
  23. }  
  24.   
  25. public int get_id() {  
  26.     return _id;  
  27. }  
  28.   
  29. public void set_id(int _id) {  
  30.     this._id = _id;  
  31. }  
  32.   
  33. public String getColumn1() {  
  34.     return column1;  
  35. }  
  36.   
  37. public void setColumn1(String column1) {  
  38.     this.column1 = column1;  
  39. }  
  40.   
  41. public String getColumn2() {  
  42.     return column2;  
  43. }  
  44.   
  45. public void setColumn2(String column2) {  
  46.     this.column2 = column2;  
  47. }  
  48.   
  49. public String getColumn3() {  
  50.     return column3;  
  51. }  
  52.   
  53. public void setColumn3(String column3) {  
  54.     this.column3 = column3;  
  55. }  
表初始化完整之后,有人会问怎么创建这张表呢?遗憾的是xutils3并没有提供单独创建一张表的方法,他是在你调插入数据库操作的时候会判断是否存在这张表,如果不存在就会去创建,查看源码得知:

[java]  view plain  copy
 print ?
  1. @Override  
  2.    public void saveOrUpdate(Object entity) throws DbException {  
  3.        try {  
  4.            beginTransaction();  
  5.   
  6.            if (entity instanceof List) {  
  7.                List entities = (List) entity;  
  8.                if (entities.isEmpty()) return;  
  9.                TableEntity table = this.getTable(entities.get(0).getClass());  
  10.                createTableIfNotExist(table);//这里就是判断如果不存在这张表,那就创建这张表  
  11.                for (Object item : entities) {  
  12.                    saveOrUpdateWithoutTransaction(table, item);  
  13.                }  
  14.            } else {  
  15.                TableEntity table = this.getTable(entity.getClass());  
  16.                createTableIfNotExist(table);  
  17.                saveOrUpdateWithoutTransaction(table, entity);  
  18.            }  
  19.   
  20.            setTransactionSuccessful();  
  21.        } finally {  
  22.            endTransaction();  
  23.        }  
  24.    }  
那如果有人需要单独创建一张表怎么办呢?方法当然是有的,小弟当初一开始是这么干的:

MyApplication.db.save(new Test());
这样不是不可以,但是这么干会让你的数据库插入一条空的Test对象,略有强迫症的小弟显然不会这么干,想着一定要创建一张空表,后来研究了一番,发现只能继承DbBase这个类,重新里面的creatTable方法,代码如下:

[java]  view plain  copy
 print ?
  1. package com.sitsmice.utils;  
  2.   
  3. import android.database.Cursor;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteStatement;  
  6. import android.os.Build;  
  7.   
  8. import com.sitsmice.MyApplication;  
  9. import com.sitsmice.idevevt_jar.MLog;  
  10. import com.sitsmice.model.Message;  
  11. import com.sitsmice.model.sign.Sign_User;  
  12. import com.sitsmice.model.teamtask.TeamTask;  
  13.   
  14. import org.xutils.DbManager;  
  15. import org.xutils.common.util.IOUtil;  
  16. import org.xutils.common.util.KeyValue;  
  17. import org.xutils.common.util.LogUtil;  
  18. import org.xutils.db.Selector;  
  19. import org.xutils.db.sqlite.SqlInfo;  
  20. import org.xutils.db.sqlite.SqlInfoBuilder;  
  21. import org.xutils.db.sqlite.WhereBuilder;  
  22. import org.xutils.db.table.ColumnEntity;  
  23. import org.xutils.db.table.DbBase;  
  24. import org.xutils.db.table.DbModel;  
  25. import org.xutils.db.table.TableEntity;  
  26. import org.xutils.ex.DbException;  
  27. import org.xutils.x;  
  28.   
  29. import java.io.File;  
  30. import java.io.IOException;  
  31. import java.util.ArrayList;  
  32. import java.util.HashMap;  
  33. import java.util.List;  
  34. import java.util.Map;  
  35.   
  36. /** 
  37.  * Created by sahara on 2016/6/3. 
  38.  */  
  39. public class MyDbBase extends DbBase{  
  40.     public static MyDbBase myDbBase;  
  41.   
  42.     public static MyDbBase getInstance(){  
  43.         if (myDbBase==null){  
  44.             myDbBase = new MyDbBase(MyApplication.daoConfig);  
  45.         }  
  46.         return myDbBase;  
  47.     }  
  48.   
  49.     /** 
  50.      * 创建一张表 
  51.      * @param t 
  52.      * @param  
  53.      * @throws DbException 
  54.      */  
  55.     public  void  creatTable(T t) throws DbException {  
  56.         TableEntity table = this.getTable(t.getClass());  
  57.         createTableIfNotExist(table);  
  58.     }  
  59.   
  60.     /** 
  61.      * 按照字段checked_time降序将sign_user对象查询出来 
  62.      */  
  63.     public List orderBY(int status,String snid) throws DbException {  
  64.         Cursor cursor = MyApplication.db.execQuery("SELECT * FROM sign_user WHERE status = '" + status + "' and snid = '" + snid + "'ORDER BY checked_time DESC");  
  65.         List list = new ArrayList<>();  
  66.         while (cursor.moveToNext()){  
  67.             Sign_User sign_user = new Sign_User();  
  68.             sign_user._id = cursor.getInt(cursor.getColumnIndex("_id"));  
  69.             sign_user.snuid = cursor.getString(cursor.getColumnIndex("snuid"));  
  70.             sign_user.snid = cursor.getString(cursor.getColumnIndex("snid"));  
  71.             sign_user.mid = cursor.getInt(cursor.getColumnIndex("mid"));  
  72.             sign_user.lid = cursor.getInt(cursor.getColumnIndex("lid"));  
  73.             sign_user.userName = cursor.getString(cursor.getColumnIndex("userName"));  
  74.             sign_user.company = cursor.getString(cursor.getColumnIndex("company"));  
  75.             sign_user.phone = cursor.getString(cursor.getColumnIndex("phone"));  
  76.             sign_user.sex = cursor.getString(cursor.getColumnIndex("sex"));  
  77.             sign_user.email = cursor.getString(cursor.getColumnIndex("email"));  
  78.             sign_user.ivcode = cursor.getString(cursor.getColumnIndex("ivcode"));  
  79.             sign_user.checked = cursor.getString(cursor.getColumnIndex("checked"));  
  80.             sign_user.reason = cursor.getString(cursor.getColumnIndex("reason"));  
  81.             sign_user.checked_time = cursor.getString(cursor.getColumnIndex("checked_time"));  
  82.             sign_user.signData = cursor.getString(cursor.getColumnIndex("signData"));  
  83.             sign_user.delete_time = cursor.getString(cursor.getColumnIndex("delete_time"));  
  84.             sign_user.status = cursor.getInt(cursor.getColumnIndex("status"));  
  85.             sign_user.url = cursor.getString(cursor.getColumnIndex("url"));  
  86.             sign_user.referer_url = cursor.getString(cursor.getColumnIndex("referer_url"));  
  87.             sign_user.add_ip = cursor.getString(cursor.getColumnIndex("add_ip"));  
  88.             sign_user.add_time = cursor.getString(cursor.getColumnIndex("add_time"));  
  89.             sign_user.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name"));  
  90.             sign_user.update_ip = cursor.getString(cursor.getColumnIndex("update_ip"));  
  91.             sign_user.update_time = cursor.getString(cursor.getColumnIndex("update_time"));  
  92.             sign_user.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name"));  
  93.             sign_user.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY"));  
  94.             sign_user.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE"));  
  95.             sign_user.eating_habits = cursor.getString(cursor.getColumnIndex("eating_habits"));  
  96.             sign_user.update = cursor.getInt(cursor.getColumnIndex("update"));  
  97.             sign_user.longitude = cursor.getString(cursor.getColumnIndex("longitude"));  
  98.             sign_user.latitude = cursor.getString(cursor.getColumnIndex("latitude"));  
  99.             sign_user.deviceid = cursor.getString(cursor.getColumnIndex("deviceid"));  
  100. //            MLog.e("test","当前解析对象:"+sign_user.toString());  
  101.             list.add(sign_user);  
  102.         }  
  103.         if (cursor!=null){  
  104.             cursor.close();  
  105.         }  
  106.         return list;  
  107.     }  
  108.   
  109.     /** 
  110.      * 按照字段checked_time降序将sign_user对象查询出来 
  111.      */  
  112.     public List orderBYDianM(int status,String snid) throws DbException {  
  113.         Cursor cursor = MyApplication.db.execQuery("SELECT * FROM sign_user WHERE status = '"+status+"' and snid = '"+snid+"'ORDER BY checked DESC,checked_time DESC");  
  114.         List list = new ArrayList<>();  
  115.         while (cursor.moveToNext()){  
  116.             Sign_User sign_user = new Sign_User();  
  117.             sign_user._id = cursor.getInt(cursor.getColumnIndex("_id"));  
  118.             sign_user.snuid = cursor.getString(cursor.getColumnIndex("snuid"));  
  119.             sign_user.snid = cursor.getString(cursor.getColumnIndex("snid"));  
  120.             sign_user.mid = cursor.getInt(cursor.getColumnIndex("mid"));  
  121.             sign_user.lid = cursor.getInt(cursor.getColumnIndex("lid"));  
  122.             sign_user.userName = cursor.getString(cursor.getColumnIndex("userName"));  
  123.             sign_user.company = cursor.getString(cursor.getColumnIndex("company"));  
  124.             sign_user.phone = cursor.getString(cursor.getColumnIndex("phone"));  
  125.             sign_user.sex = cursor.getString(cursor.getColumnIndex("sex"));  
  126.             sign_user.email = cursor.getString(cursor.getColumnIndex("email"));  
  127.             sign_user.ivcode = cursor.getString(cursor.getColumnIndex("ivcode"));  
  128.             sign_user.checked = cursor.getString(cursor.getColumnIndex("checked"));  
  129.             sign_user.reason = cursor.getString(cursor.getColumnIndex("reason"));  
  130.             sign_user.checked_time = cursor.getString(cursor.getColumnIndex("checked_time"));  
  131.             sign_user.signData = cursor.getString(cursor.getColumnIndex("signData"));  
  132.             sign_user.delete_time = cursor.getString(cursor.getColumnIndex("delete_time"));  
  133.             sign_user.status = cursor.getInt(cursor.getColumnIndex("status"));  
  134.             sign_user.url = cursor.getString(cursor.getColumnIndex("url"));  
  135.             sign_user.referer_url = cursor.getString(cursor.getColumnIndex("referer_url"));  
  136.             sign_user.add_ip = cursor.getString(cursor.getColumnIndex("add_ip"));  
  137.             sign_user.add_time = cursor.getString(cursor.getColumnIndex("add_time"));  
  138.             sign_user.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name"));  
  139.             sign_user.update_ip = cursor.getString(cursor.getColumnIndex("update_ip"));  
  140.             sign_user.update_time = cursor.getString(cursor.getColumnIndex("update_time"));  
  141.             sign_user.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name"));  
  142.             sign_user.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY"));  
  143.             sign_user.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE"));  
  144.             sign_user.eating_habits = cursor.getString(cursor.getColumnIndex("eating_habits"));  
  145.             sign_user.update = cursor.getInt(cursor.getColumnIndex("update"));  
  146.             sign_user.longitude = cursor.getString(cursor.getColumnIndex("longitude"));  
  147.             sign_user.latitude = cursor.getString(cursor.getColumnIndex("latitude"));  
  148.             sign_user.deviceid = cursor.getString(cursor.getColumnIndex("deviceid"));  
  149. //            MLog.e("test","当前解析对象:"+sign_user.toString());  
  150.             list.add(sign_user);  
  151.         }  
  152.         if (cursor!=null){  
  153.             cursor.close();  
  154.         }  
  155.         return list;  
  156.     }  
  157.   
  158.     /** 
  159.      * 按照指定字段排序并解析出相应的任务列表 
  160.      */  
  161.     public List orderBYtask(int status,HashMap map,String condition) throws DbException {  
  162.         List list = new ArrayList<>();  
  163.         Cursor cursor;  
  164.         StringBuilder sb = new StringBuilder();  
  165.         sb.append("SELECT * FROM teamtask WHERE status = '" + status+"'");  
  166.         for (Map.Entry entry:map.entrySet()) {  
  167.             sb.append("and "+entry.getKey()+"='"+entry.getValue()+"'");  
  168.         }  
  169.         if (condition.equals("update_time")){  
  170.             sb.append("ORDER BY update_time DESC");  
  171. //            cursor = MyApplication.db.execQuery("SELECT * FROM teamtask WHERE status = '" + status + "' and mid = '" + mid + "' and tuid = '" + tuid + "'ORDER BY update_time DESC");  
  172.         }  
  173.         if (condition.equals("endtime")){  
  174.             sb.append("ORDER BY endtime DESC");  
  175. //            cursor = MyApplication.db.execQuery("SELECT * FROM teamtask WHERE status = '" + status + "' and mid = '" + mid + "' and tuid = '" + tuid + "'ORDER BY endtime DESC");  
  176.         }  
  177.         MLog.e("test","MyDbBase log:当前sql语句-"+sb.toString());  
  178.         cursor = MyApplication.db.execQuery(sb.toString());  
  179.         if (cursor!=null){  
  180.             while (cursor.moveToNext()){//开始解析  
  181.                 TeamTask teamTask = new TeamTask();  
  182.                 teamTask._id = cursor.getInt(cursor.getColumnIndex("_id"));  
  183.                 teamTask.tid = cursor.getInt(cursor.getColumnIndex("tid"));  
  184.                 teamTask.mid = cursor.getInt(cursor.getColumnIndex("mid"));  
  185.                 teamTask.parentid = cursor.getInt(cursor.getColumnIndex("parentid"));  
  186.                 teamTask.tuid = cursor.getInt(cursor.getColumnIndex("tuid"));  
  187.                 teamTask.creattuid = cursor.getInt(cursor.getColumnIndex("creattuid"));  
  188.                 teamTask.typeid = cursor.getInt(cursor.getColumnIndex("typeid"));  
  189.                 teamTask.startask = cursor.getInt(cursor.getColumnIndex("startask"));  
  190.   
  191.                 teamTask.title = cursor.getString(cursor.getColumnIndex("title"));  
  192.                 teamTask.content = cursor.getString(cursor.getColumnIndex("content"));  
  193.                 teamTask.attachment = cursor.getString(cursor.getColumnIndex("attachment"));  
  194.                 teamTask.nickname = cursor.getString(cursor.getColumnIndex("nickname"));  
  195.                 teamTask.creatnickname = cursor.getString(cursor.getColumnIndex("creatnickname"));  
  196.                 teamTask.typename = cursor.getString(cursor.getColumnIndex("typename"));  
  197.                 teamTask.starttime = cursor.getString(cursor.getColumnIndex("starttime"));  
  198.                 teamTask.endtime = cursor.getString(cursor.getColumnIndex("endtime"));  
  199.                 teamTask.mark = cursor.getString(cursor.getColumnIndex("mark"));  
  200.                 teamTask.situation = cursor.getString(cursor.getColumnIndex("situation"));  
  201.   
  202.                 teamTask.delete_time = cursor.getString(cursor.getColumnIndex("delete_time"));  
  203.                 teamTask.status = cursor.getInt(cursor.getColumnIndex("status"));  
  204.                 teamTask.url = cursor.getString(cursor.getColumnIndex("url"));  
  205.                 teamTask.referer_url = cursor.getString(cursor.getColumnIndex("referer_url"));  
  206.                 teamTask.add_ip = cursor.getString(cursor.getColumnIndex("add_ip"));  
  207.                 teamTask.add_time = cursor.getString(cursor.getColumnIndex("add_time"));  
  208.                 teamTask.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name"));  
  209.                 teamTask.update_ip = cursor.getString(cursor.getColumnIndex("update_ip"));  
  210.                 teamTask.update_time = cursor.getString(cursor.getColumnIndex("update_time"));  
  211.                 teamTask.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name"));  
  212.                 teamTask.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY"));  
  213.                 teamTask.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE"));  
  214.                 list.add(teamTask);  
  215.             }  
  216.             cursor.close();  
  217.         }  
  218.         return list;  
  219.     }  
  220.   
  221.     /** 
  222.      * 按照指定字段排序并解析出相应的任务列表 
  223.      */  
  224.     public List orderBYtaskstar(int status,int mid,int tuid,String condition) throws DbException {  
  225.         List list = new ArrayList<>();  
  226.         String strSql = "SELECT * FROM teamtask WHERE status = '" + status + "' and mid = '" + mid + "' and (tuid = '" + tuid + "' or ()ORDER BY update_time DESC";  
  227.         Cursor cursor= MyApplication.db.execQuery(strSql);  
  228.         MLog.e("test","MyDbBase log:当前sql语句-"+strSql);  
  229.         if (cursor!=null){  
  230.             while (cursor.moveToNext()){//开始解析  
  231.                 TeamTask teamTask = new TeamTask();  
  232.                 teamTask._id = cursor.getInt(cursor.getColumnIndex("_id"));  
  233.                 teamTask.tid = cursor.getInt(cursor.getColumnIndex("tid"));  
  234.                 teamTask.mid = cursor.getInt(cursor.getColumnIndex("mid"));  
  235.                 teamTask.parentid = cursor.getInt(cursor.getColumnIndex("parentid"));  
  236.                 teamTask.tuid = cursor.getInt(cursor.getColumnIndex("tuid"));  
  237.                 teamTask.creattuid = cursor.getInt(cursor.getColumnIndex("creattuid"));  
  238.                 teamTask.typeid = cursor.getInt(cursor.getColumnIndex("typeid"));  
  239.                 teamTask.startask = cursor.getInt(cursor.getColumnIndex("startask"));  
  240.   
  241.                 teamTask.title = cursor.getString(cursor.getColumnIndex("title"));  
  242.                 teamTask.content = cursor.getString(cursor.getColumnIndex("content"));  
  243.                 teamTask.attachment = cursor.getString(cursor.getColumnIndex("attachment"));  
  244.                 teamTask.nickname = cursor.getString(cursor.getColumnIndex("nickname"));  
  245.                 teamTask.creatnickname = cursor.getString(cursor.getColumnIndex("creatnickname"));  
  246.                 teamTask.typename = cursor.getString(cursor.getColumnIndex("typename"));  
  247.                 teamTask.starttime = cursor.getString(cursor.getColumnIndex("starttime"));  
  248.                 teamTask.endtime = cursor.getString(cursor.getColumnIndex("endtime"));  
  249.                 teamTask.mark = cursor.getString(cursor.getColumnIndex("mark"));  
  250.                 teamTask.situation = cursor.getString(cursor.getColumnIndex("situation"));  
  251.   
  252.                 teamTask.delete_time = cursor.getString(cursor.getColumnIndex("delete_time"));  
  253.                 teamTask.status = cursor.getInt(cursor.getColumnIndex("status"));  
  254.                 teamTask.url = cursor.getString(cursor.getColumnIndex("url"));  
  255.                 teamTask.referer_url = cursor.getString(cursor.getColumnIndex("referer_url"));  
  256.                 teamTask.add_ip = cursor.getString(cursor.getColumnIndex("add_ip"));  
  257.                 teamTask.add_time = cursor.getString(cursor.getColumnIndex("add_time"));  
  258.                 teamTask.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name"));  
  259.                 teamTask.update_ip = cursor.getString(cursor.getColumnIndex("update_ip"));  
  260.                 teamTask.update_time = cursor.getString(cursor.getColumnIndex("update_time"));  
  261.                 teamTask.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name"));  
  262.                 teamTask.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY"));  
  263.                 teamTask.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE"));  
  264.                 list.add(teamTask);  
  265.             }  
  266.             cursor.close();  
  267.         }  
  268.         return list;  
  269.     }  
  270.   
  271.     /** 
  272.      * 按时间降序排序推送消息 
  273.      */  
  274.     public List orderBYMessage(String tuid){  
  275.         List list = new ArrayList<>();  
  276.         String sql = "SELECT * FROM message WHERE tuid = '"+tuid+"' and _id != '0' ORDER BY time DESC";  
  277.         MLog.e("test","当前sql语句:"+sql);  
  278.         try {  
  279.             Cursor cursor = MyApplication.db.execQuery(sql);  
  280.             if (cursor!=null){  
  281.                 while (cursor.moveToNext()){  
  282.                     Message msg = new Message();  
  283.                     msg._id = cursor.getInt(cursor.getColumnIndex("_id"));  
  284.                     msg.tuid = cursor.getString(cursor.getColumnIndex("tuid"));  
  285.                     msg.time = cursor.getString(cursor.getColumnIndex("time"));  
  286.                     msg.title = cursor.getString(cursor.getColumnIndex("title"));  
  287.                     msg.content = cursor.getString(cursor.getColumnIndex("content"));  
  288.                     msg.isRead = cursor.getInt(cursor.getColumnIndex("isRead"));  
  289.                     list.add(msg);  
  290.                 }  
  291.                 cursor.close();  
  292.             }  
  293.         } catch (DbException e) {  
  294.             e.printStackTrace();  
  295.         }  
  296.         return list;  
  297.     }  
  298.   
  299.     /** 
  300.      * key: dbName 
  301.      */  
  302.     private final static HashMap DAO_MAP = new HashMap();  
  303.   
  304.     private SQLiteDatabase database;  
  305.     private DaoConfig daoConfig;  
  306.     private boolean allowTransaction;  
  307.   
  308.     private MyDbBase(DaoConfig config) {  
  309.         if (config == null) {  
  310.             throw new IllegalArgumentException("daoConfig may not be null");  
  311.         }  
  312.         this.daoConfig = config;  
  313.         this.allowTransaction = config.isAllowTransaction();  
  314.         this.database = openOrCreateDatabase(config);  
  315.         DbOpenListener dbOpenListener = config.getDbOpenListener();  
  316.         if (dbOpenListener != null) {  
  317.             dbOpenListener.onDbOpened(this);  
  318.         }  
  319.     }  
  320.   
  321.     public synchronized static DbManager getInstance(DaoConfig daoConfig) {  
  322.   
  323.         if (daoConfig == null) {//使用默认配置  
  324.             daoConfig = new DaoConfig();  
  325.         }  
  326.   
  327.         MyDbBase dao = DAO_MAP.get(daoConfig);  
  328.         if (dao == null) {  
  329.             dao = new MyDbBase(daoConfig);  
  330.             DAO_MAP.put(daoConfig, dao);  
  331.         } else {  
  332.             dao.daoConfig = daoConfig;  
  333.         }  
  334.   
  335.         // update the database if needed  
  336.         SQLiteDatabase database = dao.database;  
  337.         int oldVersion = database.getVersion();  
  338.         int newVersion = daoConfig.getDbVersion();  
  339.         if (oldVersion != newVersion) {  
  340.             if (oldVersion != 0) {  
  341.                 DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener();  
  342.                 if (upgradeListener != null) {  
  343.                     upgradeListener.onUpgrade(dao, oldVersion, newVersion);  
  344.                 } else {  
  345.                     try {  
  346.                         dao.dropDb();  
  347.                     } catch (DbException e) {  
  348.                         LogUtil.e(e.getMessage(), e);  
  349.                     }  
  350.                 }  
  351.             }  
  352.             database.setVersion(newVersion);  
  353.         }  
  354.   
  355.         return dao;  
  356.     }  
  357.   
  358.     @Override  
  359.     public SQLiteDatabase getDatabase() {  
  360.         return database;  
  361.     }  
  362.   
  363.     @Override  
  364.     public DaoConfig getDaoConfig() {  
  365.         return daoConfig;  
  366.     }  
  367.   
  368.     //*********************************************** operations ********************************************************  
  369.   
  370.     @Override  
  371.     public void saveOrUpdate(Object entity) throws DbException {  
  372.         try {  
  373.             beginTransaction();  
  374.   
  375.             if (entity instanceof List) {  
  376.                 List entities = (List) entity;  
  377.                 if (entities.isEmpty()) return;  
  378.                 TableEntity table = this.getTable(entities.get(0).getClass());  
  379.                 createTableIfNotExist(table);  
  380.                 for (Object item : entities) {  
  381.                     saveOrUpdateWithoutTransaction(table, item);  
  382.                 }  
  383.             } else {  
  384.                 TableEntity table = this.getTable(entity.getClass());  
  385.                 createTableIfNotExist(table);  
  386.                 saveOrUpdateWithoutTransaction(table, entity);  
  387.             }  
  388.   
  389.             setTransactionSuccessful();  
  390.         } finally {  
  391.             endTransaction();  
  392.         }  
  393.     }  
  394.   
  395.     @Override  
  396.     public void replace(Object entity) throws DbException {  
  397.         try {  
  398.             beginTransaction();  
  399.   
  400.             if (entity instanceof List) {  
  401.                 List entities = (List) entity;  
  402.                 if (entities.isEmpty()) return;  
  403.                 TableEntity table = this.getTable(entities.get(0).getClass());  
  404.                 createTableIfNotExist(table);  
  405.                 for (Object item : entities) {  
  406.                     execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, item));  
  407.                 }  
  408.             } else {  
  409.                 TableEntity table = this.getTable(entity.getClass());  
  410.                 createTableIfNotExist(table);  
  411.                 execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, entity));  
  412.             }  
  413.   
  414.             setTransactionSuccessful();  
  415.         } finally {  
  416.             endTransaction();  
  417.         }  
  418.     }  
  419.   
  420.     @Override  
  421.     public void save(Object entity) throws DbException {  
  422.         try {  
  423.             beginTransaction();  
  424.   
  425.             if (entity instanceof List) {  
  426.                 List entities = (List) entity;  
  427.                 if (entities.isEmpty()) return;  
  428.                 TableEntity table = this.getTable(entities.get(0).getClass());  
  429.                 createTableIfNotExist(table);  
  430.                 for (Object item : entities) {  
  431.                     execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, item));  
  432.                 }  
  433.             } else {  
  434.                 TableEntity table = this.getTable(entity.getClass());  
  435.                 createTableIfNotExist(table);  
  436.                 execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity));  
  437.             }  
  438.   
  439.             setTransactionSuccessful();  
  440.         } finally {  
  441.             endTransaction();  
  442.         }  
  443.     }  
  444.   
  445.     @Override  
  446.     public boolean saveBindingId(Object entity) throws DbException {  
  447.         boolean result = false;  
  448.         try {  
  449.             beginTransaction();  
  450.   
  451.             if (entity instanceof List) {  
  452.                 List entities = (List) entity;  
  453.                 if (entities.isEmpty()) return false;  
  454.                 TableEntity table = this.getTable(entities.get(0).getClass());  
  455.                 createTableIfNotExist(table);  
  456.                 for (Object item : entities) {  
  457.                     if (!saveBindingIdWithoutTransaction(table, item)) {  
  458.                         throw new DbException("saveBindingId error, transaction will not commit!");  
  459.                     }  
  460.                 }  
  461.             } else {  
  462.                 TableEntity table = this.getTable(entity.getClass());  
  463.                 createTableIfNotExist(table);  
  464.                 result = saveBindingIdWithoutTransaction(table, entity);  
  465.             }  
  466.   
  467.             setTransactionSuccessful();  
  468.         } finally {  
  469.             endTransaction();  
  470.         }  
  471.         return result;  
  472.     }  
  473.   
  474.     @Override  
  475.     public void deleteById(Class entityType, Object idValue) throws DbException {  
  476.         TableEntity table = this.getTable(entityType);  
  477.         if (!table.tableIsExist()) return;  
  478.         try {  
  479.             beginTransaction();  
  480.   
  481.             execNonQuery(SqlInfoBuilder.buildDeleteSqlInfoById(table, idValue));  
  482.   
  483.             setTransactionSuccessful();  
  484.         } finally {  
  485.             endTransaction();  
  486.         }  
  487.     }  
  488.   
  489.     @Override  
  490.     public void delete(Object entity) throws DbException {  
  491.         try {  
  492.             beginTransaction();  
  493.   
  494.             if (entity instanceof List) {  
  495.                 List entities = (List) entity;  
  496.                 if (entities.isEmpty()) return;  
  497.                 TableEntity table = this.getTable(entities.get(0).getClass());  
  498.                 if (!table.tableIsExist()) return;  
  499.                 for (Object item : entities) {  
  500.                     execNonQuery(SqlInfoBuilder.buildDeleteSqlInfo(table, item));  
  501.                 }  
  502.             } else {  
  503.                 TableEntity table = this.getTable(entity.getClass());  
  504.                 if (!table.tableIsExist()) return;  
  505.                 execNonQuery(SqlInfoBuilder.buildDeleteSqlInfo(table, entity));  
  506.             }  
  507.   
  508.             setTransactionSuccessful();  
  509.         } finally {  
  510.             endTransaction();  
  511.         }  
  512.     }  
  513.   
  514.     @Override  
  515.     public void delete(Class entityType) throws DbException {  
  516.         delete(entityType, null);  
  517.     }  
  518.   
  519.     @Override  
  520.     public int delete(Class entityType, WhereBuilder whereBuilder) throws DbException {  
  521.         TableEntity table = this.getTable(entityType);  
  522.         if (!table.tableIsExist()) return 0;  
  523.         int result = 0;  
  524.         try {  
  525.             beginTransaction();  
  526.   
  527.             result = executeUpdateDelete(SqlInfoBuilder.buildDeleteSqlInfo(table, whereBuilder));  
  528.   
  529.             setTransactionSuccessful();  
  530.         } finally {  
  531.             endTransaction();  
  532.         }  
  533.         return result;  
  534.     }  
  535.   
  536.     @Override  
  537.     public void update(Object entity, String... updateColumnNames) throws DbException {  
  538.         try {  
  539.             beginTransaction();  
  540.   
  541.             if (entity instanceof List) {  
  542.                 List entities = (List) entity;  
  543.                 if (entities.isEmpty()) return;  
  544.                 TableEntity table = this.getTable(entities.get(0).getClass());  
  545.                 if (!table.tableIsExist()) return;  
  546.                 for (Object item : entities) {  
  547.                     execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, item, updateColumnNames));  
  548.                 }  
  549.             } else {  
  550.                 TableEntity table = this.getTable(entity.getClass());  
  551.                 if (!table.tableIsExist()) return;  
  552.                 execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, entity, updateColumnNames));  
  553.             }  
  554.   
  555.             setTransactionSuccessful();  
  556.         } finally {  
  557.             endTransaction();  
  558.         }  
  559.     }  
  560.   
  561.     @Override  
  562.     public int update(Class entityType, WhereBuilder whereBuilder, KeyValue... nameValuePairs) throws DbException {  
  563.         TableEntity table = this.getTable(entityType);  
  564.         if (!table.tableIsExist()) return 0;  
  565.   
  566.         int result = 0;  
  567.         try {  
  568.             beginTransaction();  
  569.   
  570.             result = executeUpdateDelete(SqlInfoBuilder.buildUpdateSqlInfo(table, whereBuilder, nameValuePairs));  
  571.   
  572.             setTransactionSuccessful();  
  573.         } finally {  
  574.             endTransaction();  
  575.         }  
  576.   
  577.         return result;  
  578.     }  
  579.   
  580.     @Override  
  581.     @SuppressWarnings("unchecked")  
  582.     public  T findById(Class entityType, Object idValue) throws DbException {  
  583.         return null;  
  584.     }  
  585.   
  586.     @Override  
  587.     public  T findFirst(Class entityType) throws DbException {  
  588.         return this.selector(entityType).findFirst();  
  589.     }  
  590.   
  591.     @Override  
  592.     public  List findAll(Class entityType) throws DbException {  
  593.         return this.selector(entityType).findAll();  
  594.     }  
  595.   
  596.     @Override  
  597.     public  Selector selector(Class entityType) throws DbException {  
  598.         return null;  
  599.     }  
  600.   
  601.     @Override  
  602.     public DbModel findDbModelFirst(SqlInfo sqlInfo) throws DbException {  
  603.         return null;  
  604.     }  
  605.   
  606.     @Override  
  607.     public List findDbModelAll(SqlInfo sqlInfo) throws DbException {  
  608.         return null;  
  609.     }  
  610.   
  611.     //******************************************** config ******************************************************  
  612.   
  613.     private SQLiteDatabase openOrCreateDatabase(DaoConfig config) {  
  614.         SQLiteDatabase result = null;  
  615.   
  616.         File dbDir = config.getDbDir();  
  617.         if (dbDir != null && (dbDir.exists() || dbDir.mkdirs())) {  
  618.             File dbFile = new File(dbDir, config.getDbName());  
  619.             result = SQLiteDatabase.openOrCreateDatabase(dbFile, null);  
  620.         } else {  
  621.             result = x.app().openOrCreateDatabase(config.getDbName(), 0null);  
  622.         }  
  623.         return result;  
  624.     }  
  625.   
  626.     //***************************** private operations with out transaction *****************************  
  627.     private void saveOrUpdateWithoutTransaction(TableEntity table, Object entity) throws DbException {  
  628.         ColumnEntity id = table.getId();  
  629.         if (id.isAutoId()) {  
  630.             if (id.getColumnValue(entity) != null) {  
  631.                 execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, entity));  
  632.             } else {  
  633.                 saveBindingIdWithoutTransaction(table, entity);  
  634.             }  
  635.         } else {  
  636.             execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, entity));  
  637.         }  
  638.     }  
  639.   
  640.     private boolean saveBindingIdWithoutTransaction(TableEntity table, Object entity) throws DbException {  
  641.         ColumnEntity id = table.getId();  
  642.         if (id.isAutoId()) {  
  643.             execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity));  
  644.             long idValue = getLastAutoIncrementId(table.getName());  
  645.             if (idValue == -1) {  
  646.                 return false;  
  647.             }  
  648.             id.setAutoIdValue(entity, idValue);  
  649.             return true;  
  650.         } else {  
  651.             execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity));  
  652.             return true;  
  653.         }  
  654.     }  
  655.   
  656.     //************************************************ tools ***********************************  
  657.   
  658.     private long getLastAutoIncrementId(String tableName) throws DbException {  
  659.         long id = -1;  
  660.         Cursor cursor = execQuery("SELECT seq FROM sqlite_sequence WHERE name='" + tableName + "' LIMIT 1");  
  661.         if (cursor != null) {  
  662.             try {  
  663.                 if (cursor.moveToNext()) {  
  664.                     id = cursor.getLong(0);  
  665.                 }  
  666.             } catch (Throwable e) {  
  667.                 throw new DbException(e);  
  668.             } finally {  
  669.                 IOUtil.closeQuietly(cursor);  
  670.             }  
  671.         }  
  672.         return id;  
  673.     }  
  674.   
  675.     @Override  
  676.     public void close() throws IOException {  
  677.         if (DAO_MAP.containsKey(daoConfig)) {  
  678.             DAO_MAP.remove(daoConfig);  
  679.             this.database.close();  
  680.         }  
  681.     }  
  682.   
  683.     / exec sql /  
  684.   
  685.     private void beginTransaction() {  
  686.         if (allowTransaction) {  
  687.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && database.isWriteAheadLoggingEnabled()) {  
  688.                 database.beginTransactionNonExclusive();  
  689.             } else {  
  690.                 database.beginTransaction();  
  691.             }  
  692.         }  
  693.     }  
  694.   
  695.     private void setTransactionSuccessful() {  
  696.         if (allowTransaction) {  
  697.             database.setTransactionSuccessful();  
  698.         }  
  699.     }  
  700.   
  701.     private void endTransaction() {  
  702.         if (allowTransaction) {  
  703.             database.endTransaction();  
  704.         }  
  705.     }  
  706.   
  707.   
  708.     @Override  
  709.     public int executeUpdateDelete(SqlInfo sqlInfo) throws DbException {  
  710.         SQLiteStatement statement = null;  
  711.         try {  
  712.             statement = sqlInfo.buildStatement(database);  
  713.             return statement.executeUpdateDelete();  
  714.         } catch (Throwable e) {  
  715.             throw new DbException(e);  
  716.         } finally {  
  717.             if (statement != null) {  
  718.                 try {  
  719.                     statement.releaseReference();  
  720.                 } catch (Throwable ex) {  
  721.                     LogUtil.e(ex.getMessage(), ex);  
  722.                 }  
  723.             }  
  724.         }  
  725.     }  
  726.   
  727.     @Override  
  728.     public int executeUpdateDelete(String sql) throws DbException {  
  729.         SQLiteStatement statement = null;  
  730.         try {  
  731.             statement = database.compileStatement(sql);  
  732.             return statement.executeUpdateDelete();  
  733.         } catch (Throwable e) {  
  734.             throw new DbException(e);  
  735.         } finally {  
  736.             if (statement != null) {  
  737.                 try {  
  738.                     statement.releaseReference();  
  739.                 } catch (Throwable ex) {  
  740.                     LogUtil.e(ex.getMessage(), ex);  
  741.                 }  
  742.             }  
  743.         }  
  744.     }  
  745.   
  746.     @Override  
  747.     public void execNonQuery(SqlInfo sqlInfo) throws DbException {  
  748.         SQLiteStatement statement = null;  
  749.         try {  
  750.             statement = sqlInfo.buildStatement(database);  
  751.             statement.execute();  
  752.         } catch (Throwable e) {  
  753.             throw new DbException(e);  
  754.         } finally {  
  755.             if (statement != null) {  
  756.                 try {  
  757.                     statement.releaseReference();  
  758.                 } catch (Throwable ex) {  
  759.                     LogUtil.e(ex.getMessage(), ex);  
  760.                 }  
  761.             }  
  762.         }  
  763.     }  
  764.   
  765.     @Override  
  766.     public void execNonQuery(String sql) throws DbException {  
  767.         try {  
  768.             database.execSQL(sql);  
  769.         } catch (Throwable e) {  
  770.             throw new DbException(e);  
  771.         }  
  772.     }  
  773.   
  774.     @Override  
  775.     public Cursor execQuery(SqlInfo sqlInfo) throws DbException {  
  776.         try {  
  777.             return database.rawQuery(sqlInfo.getSql(), sqlInfo.getBindArgsAsStrArray());  
  778.         } catch (Throwable e) {  
  779.             throw new DbException(e);  
  780.         }  
  781.     }  
  782.   
  783.     @Override  
  784.     public Cursor execQuery(String sql) throws DbException {  
  785.         try {  
  786.             return database.rawQuery(sql, null);  
  787.         } catch (Throwable e) {  
  788.             throw new DbException(e);  
  789.         }  
  790.     }  
  791.   
  792. }  
使用的时候:

MyDbBase.getInstance().creatTable(new Test());
上面的类里面我还封装了几个数据库排序的方法以及解析过程,xutils3也有提供数据库排序方法,下文有介绍,不过有的时候一些复杂的查询语句还是要自己封装一下比较好。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

接下来我就一一介绍xutils3数据库的增删改查。

1:增

/**
 * 保存实体类或实体类的List到数据库,
 * 如果该类型的id是自动生成的, 则保存完后会给id赋值.
 *
 * @param entity
 * @return
 * @throws DbException
 */
boolean saveBindingId(Object entity) throws DbException;

/**
 * 保存或更新实体类或实体类的List到数据库, 根据id对应的数据是否存在.
 *
 * @param entity
 * @throws DbException
 */
void saveOrUpdate(Object entity) throws DbException;

/**
 * 保存实体类或实体类的List到数据库
 *
 * @param entity
 * @throws DbException
 */
void save(Object entity) throws DbException;

/**
 * 保存或更新实体类或实体类的List到数据库, 根据id和其他唯一索引判断数据是否存在.
 *
 * @param entity
 * @throws DbException
 */
void replace(Object entity) throws DbException;

这是xutils3给出的注解,看似很详细,但是真当你用起来的时候可能会出现各种不想看到的问题;经过小弟的各种尝试,结论如下:

如果在你建表的时候你的主键设置成自增长,那么你在插入数据的时候直接调replace方法就可以了,但是saveOrUpdate只能达到插入的效果,达不到更新原有数据的效果

如果在你建表的时候你的主键设置成不是自增长,replace方法当然可以插入,saveOrUpdate方法既可以插入也可以达到更新的效果,当然这里要注意的是在你更新的时候你的主键要对应的上。其他几个插入的方法我在实战的时候我并没有使用过,小弟介绍的两个方法已经够自己使用了。

2:删

void delete(Object entity) throws DbException;
这个就没什么好介绍的啦,你想删除数据里的哪条数据,直接把对象放进去就OK了,这里也可以传入一个List 进行批量删除。

3:改

void update(Object entity, String... updateColumnNames) throws DbException;
这里需要注意的是:如果你拿到一个新的对象,你想更新里面所有的字段值,那就直接把对象放进去(你放进去的对象的主键一定要和你本地数据库需要更新德尔那个对象的主键保持一致,如果这个对象没有主键一定需要赋值,不然会抛异常,xutils3所有的数据库操作除了单纯的插入,其他都需要有主键才能进行的,话说sqlite都一样啊,我这里只是友情提示一下),后面的可变长度的参数不赋值就好;如果你只想更新部分字段那你只需要这么操作,这里也可以传入一个List 进行批量更新。

String[] s = {"column2","column3"};
MyApplication.db.update(test1,s);//这样就能达到只更新两个字段值得效果
4:查

<T> Selector<T> selector(Class<T> entityType) throws DbException;
xutils3的查询数据库的操作采用了经典的建造者模式,使用起来非常方便,事例如下:

try {
    List all = MyApplication.db.selector(Test.class).findAll();//查询这张表里面所有的数据,返回一个list
} catch (DbException e) {
    e.printStackTrace();
}
try {
    Test first = MyApplication.db.selector(Test.class).findFirst();//查询这张表里面的第一条数据
} catch (DbException e) {
    e.printStackTrace();
}
try {
    List all = MyApplication.db.selector(Test.class).where("column1","=","value1").and("column2", "=","value2").and("column3", "!=","value3").findAll();//多重条件查询
} catch (DbException e) {
    e.printStackTrace();
}

关于WhereBuilder这个类,是可以写一些更复杂的查询条件,有些条件语句需要用()这个括起来的,这个时候就需要用到WhereBuilder去进行组合语句的构建;

WhereBuilder whereBuilder = WhereBuilder.b("title", "like", "%"+str_screen+"%");
whereBuilder.or("creatnickname","like","%"+str_screen+"%");
List all = MyApplication.db.selector(Test.class).where(whereBuilder).findAll();

排序字段的方法:

MyApplication.db.selector(TeamTask.class).where("status", "=", 0).and("mid", "=",Config.mid).and("tuid","=",Config.tuid).and(whereBuilder).orderBy("time",true).findAll();
这个就是排序time字段,第二个参数是是否DESC,true就是desc,false就是ASC


xutils3还提供了很多有用的接口,比如如果你想在框架上加些源生的sql语句,你可以这么干:

void execNonQuery(SqlInfo sqlInfo) throws DbException;

void execNonQuery(String sql) throws DbException;

Cursor execQuery(SqlInfo sqlInfo) throws DbException;

Cursor execQuery(String sql) throws DbException;
自己写的sql经常会出错,不过没关系,你可以在抓异常里面打断点或log,看下原因即可,其实他抛出的这些接口你查看源码就知道些的其实很简单调的就是源生的sqlite方法
@Override
public void execNonQuery(String sql) throws DbException {
    try {
        database.execSQL(sql);
    } catch (Throwable e) {
        throw new DbException(e);
    }
}

你可能感兴趣的:(移动端开发)