Fragment的注解:
@ContentView(R.layout.fragment_first) public class FirstFragment extends Fragment{ private MyAdapter adapter; private List<Person> list=new ArrayList<>(); private List<String> listUrl=new ArrayList<>(); private List<String> 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<Person> list; private LayoutInflater mInflater; private ImageOptions options; public ViewHolder holder; public MyAdapter(Context context, List<Person> 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 <T> */ public static <T> Cancelable Get(String url,Map<String,String> map,CommonCallback<T> callback){ RequestParams params=new RequestParams(url); if(null!=map){ for(Map.Entry<String, String> entry : map.entrySet()){ params.addQueryStringParameter(entry.getKey(), entry.getValue()); } } Cancelable cancelable = x.http().get(params, callback); return cancelable; } /** * 发送post请求 * @param <T> */ public static <T> Cancelable Post(String url,Map<String,Object> map,CommonCallback<T> callback){ RequestParams params=new RequestParams(url); if(null!=map){ for(Map.Entry<String, Object> entry : map.entrySet()){ params.addParameter(entry.getKey(), entry.getValue()); } } Cancelable cancelable = x.http().post(params, callback); return cancelable; } /** * 上传文件 * @param <T> */ public static <T> Cancelable UpLoadFile(String url,Map<String,Object> map,CommonCallback<T> callback){ RequestParams params=new RequestParams(url); if(null!=map){ for(Map.Entry<String, Object> entry : map.entrySet()){ params.addParameter(entry.getKey(), entry.getValue()); } } params.setMultipart(true); Cancelable cancelable = x.http().post(params, callback); return cancelable; } /** * 下载文件 * @param <T> */ public static <T> Cancelable DownLoadFile(String url,String filepath,CommonCallback<T> 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<ResultType> implements Callback.CommonCallback<ResultType>{ @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<String,String> 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<PersonInfoBean>(){ @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<String,Object> 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<PersonInfoBean>(){ @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<String,Object> map=new HashMap<>(); //传入自己的相应参数 //map.put(key, value); //map.put(key, value); XUtil.UpLoadFile(url, map, new MyCallBack<String>(){ @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<File>(){ @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<File>(){ @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<String>(){ @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<Drawable>() {...}); x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...}); x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...}); 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>() {...}); 通过返回的Drawable对象进行图片的处理,满足项目的个性化的要求.说了这么多,我想大家至少会对XUtils3有了一个基本的了解,由于XUtils3的数据库的用法比较多,本篇文章不会去涉及,下一篇文章我会为大家详细讲解XUtils3的数据库模块。大家赶紧现在动手操作一下吧!本文涉及到的所有实例都会在下面的demo中有涉及到,请自行参考。
4.数据库模块
如何导入SDK我就不说了,先从初始化说起。一般三方的东西最好都是在application里面完成,代码如下:
[java] view plain copy print ? daoConfig = new DbManager.DaoConfig() .setDbName("iDEvent.db")//设置数据库名称 // 不设置dbDir时, 默认存储在app的私有目录. .setDbDir(new File("sdcard/SitSmice/iDEvent/DownLoad/dbPath")) // 数据库存储路径 .setDbVersion(1)//设置数据库版本 .setDbOpenListener(new DbManager.DbOpenListener() { @Override public void onDbOpened(DbManager db) { // 开启WAL, 对写入加速提升巨大 db.getDatabase().enableWriteAheadLogging(); } }) // .setDbUpgradeListener(new DbManager.DbUpgradeListener() { // @Override // public void onUpgrade(DbManager db, int oldVersion, int newVersion) { // // TODO: ... // try { // db.addColumn(Sign.class,"test"); // } catch (DbException e) { // MLog.e("test","数据库更新失败"); // e.printStackTrace(); // } // // db.dropTable(...); // // ... // // or // // db.dropDb(); // } // }) ; //db还有其他的一些构造方法,比如含有更新表版本的监听器的 db = x.getDb(daoConfig);//获取数据库单例 [java] view plain copy print ? 需要注意的是,我这里把那个监听数据库升级的监听屏蔽了,一般升级数据不需要特殊处理的话最好不要设置监听;正常升级数据库的方法是:比如你的app第一版数据库版本设置的是1,如果第二版数据库字段有变动,那就直接把版本设置成2就可以了,但是这样会删除你app里面的数据库,看监听源码得知: [java] view plain copy print ? public synchronized static DbManager getInstance(DaoConfig daoConfig) { if (daoConfig == null) {//使用默认配置 daoConfig = new DaoConfig(); } MyDbBase dao = DAO_MAP.get(daoConfig); if (dao == null) { dao = new MyDbBase(daoConfig); DAO_MAP.put(daoConfig, dao); } else { dao.daoConfig = daoConfig; } // update the database if needed SQLiteDatabase database = dao.database; int oldVersion = database.getVersion(); int newVersion = daoConfig.getDbVersion(); if (oldVersion != newVersion) { if (oldVersion != 0) { DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener(); if (upgradeListener != null) {//如果你不想删除之前app里面的数据,那就可以设置监听,在监听里面将之前表数据拷贝到新的表里面就可以了 upgradeListener.onUpgrade(dao, oldVersion, newVersion); } else { try { dao.dropDb();//如果设置了监听,那就直接删除了数据库,之前保存的数据就没有了 } catch (DbException e) { LogUtil.e(e.getMessage(), e); } } } database.setVersion(newVersion); } return dao; }
这里插个小曲:xutils3主要看两个类Dbmanger和DbmangerImpl,从名称就能看出来,前者是管理类,用于初始化数据库操作的接口类,后者是相对应的实现类。想研究源码的同学可以去DbmangerImpl好好学习一下。
接下来就是创建一张表了,代码如下:
[java] view plain copy print ? @Table(name = "test")//表名 public class Test { /** * isId = true 代表该字段是这张表的主键,类型也可以是String (赋值为false就不是主键了),虽然数据库表可以设置多个主键,但是在实际操作的时候还是设置一个 * <span style="font-family: Arial, Helvetica, sans-serif;">主键最好,小弟设置过两个主键,但是并没有达到我想要的效果</span> [java] view plain copy print ? * autoGen = true 代表主键自增长,如果不是自增长,那就赋值false (这里主键是否自增长很关键,会影响到后面数据库的操作,下面再结合方法来解释) */ @Column(name = "_id",isId = true,autoGen = true) public int _id; @Column(name = "column1")//字段名称1 public String column1; @Column(name = "column2")//字段名称2 public String column2; @Column(name = "column3")//字段名称3 public String column3; @Override public String toString() { return "Test{" + "_id=" + _id + ", column1='" + column1 + '\'' + ", column2='" + column2 + '\'' + ", column3='" + column3 + '\'' + '}'; } public int get_id() { return _id; } public void set_id(int _id) { this._id = _id; } public String getColumn1() { return column1; } public void setColumn1(String column1) { this.column1 = column1; } public String getColumn2() { return column2; } public void setColumn2(String column2) { this.column2 = column2; } public String getColumn3() { return column3; } public void setColumn3(String column3) { this.column3 = column3; } 表初始化完整之后,有人会问怎么创建这张表呢?遗憾的是xutils3并没有提供单独创建一张表的方法,他是在你调插入数据库操作的时候会判断是否存在这张表,如果不存在就会去创建,查看源码得知:
[java] view plain copy print ? @Override public void saveOrUpdate(Object entity) throws DbException { try { beginTransaction(); if (entity instanceof List) { List<?> entities = (List<?>) entity; if (entities.isEmpty()) return; TableEntity<?> table = this.getTable(entities.get(0).getClass()); createTableIfNotExist(table);//这里就是判断如果不存在这张表,那就创建这张表 for (Object item : entities) { saveOrUpdateWithoutTransaction(table, item); } } else { TableEntity<?> table = this.getTable(entity.getClass()); createTableIfNotExist(table); saveOrUpdateWithoutTransaction(table, entity); } setTransactionSuccessful(); } finally { endTransaction(); } } 那如果有人需要单独创建一张表怎么办呢?方法当然是有的,小弟当初一开始是这么干的:
MyApplication.db.save(new Test()); 这样不是不可以,但是这么干会让你的数据库插入一条空的Test对象,略有强迫症的小弟显然不会这么干,想着一定要创建一张空表,后来研究了一番,发现只能继承DbBase这个类,重新里面的creatTable方法,代码如下:
[java] view plain copy print ? package com.sitsmice.utils; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import android.os.Build; import com.sitsmice.MyApplication; import com.sitsmice.idevevt_jar.MLog; import com.sitsmice.model.Message; import com.sitsmice.model.sign.Sign_User; import com.sitsmice.model.teamtask.TeamTask; import org.xutils.DbManager; import org.xutils.common.util.IOUtil; import org.xutils.common.util.KeyValue; import org.xutils.common.util.LogUtil; import org.xutils.db.Selector; import org.xutils.db.sqlite.SqlInfo; import org.xutils.db.sqlite.SqlInfoBuilder; import org.xutils.db.sqlite.WhereBuilder; import org.xutils.db.table.ColumnEntity; import org.xutils.db.table.DbBase; import org.xutils.db.table.DbModel; import org.xutils.db.table.TableEntity; import org.xutils.ex.DbException; import org.xutils.x; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by sahara on 2016/6/3. */ public class MyDbBase extends DbBase{ public static MyDbBase myDbBase; public static MyDbBase getInstance(){ if (myDbBase==null){ myDbBase = new MyDbBase(MyApplication.daoConfig); } return myDbBase; } /** * 创建一张表 * @param t * @param <T> * @throws DbException */ public <T> void creatTable(T t) throws DbException { TableEntity<?> table = this.getTable(t.getClass()); createTableIfNotExist(table); } /** * 按照字段checked_time降序将sign_user对象查询出来 */ public List<Sign_User> orderBY(int status,String snid) throws DbException { Cursor cursor = MyApplication.db.execQuery("SELECT * FROM sign_user WHERE status = '" + status + "' and snid = '" + snid + "'ORDER BY checked_time DESC"); List<Sign_User> list = new ArrayList<>(); while (cursor.moveToNext()){ Sign_User sign_user = new Sign_User(); sign_user._id = cursor.getInt(cursor.getColumnIndex("_id")); sign_user.snuid = cursor.getString(cursor.getColumnIndex("snuid")); sign_user.snid = cursor.getString(cursor.getColumnIndex("snid")); sign_user.mid = cursor.getInt(cursor.getColumnIndex("mid")); sign_user.lid = cursor.getInt(cursor.getColumnIndex("lid")); sign_user.userName = cursor.getString(cursor.getColumnIndex("userName")); sign_user.company = cursor.getString(cursor.getColumnIndex("company")); sign_user.phone = cursor.getString(cursor.getColumnIndex("phone")); sign_user.sex = cursor.getString(cursor.getColumnIndex("sex")); sign_user.email = cursor.getString(cursor.getColumnIndex("email")); sign_user.ivcode = cursor.getString(cursor.getColumnIndex("ivcode")); sign_user.checked = cursor.getString(cursor.getColumnIndex("checked")); sign_user.reason = cursor.getString(cursor.getColumnIndex("reason")); sign_user.checked_time = cursor.getString(cursor.getColumnIndex("checked_time")); sign_user.signData = cursor.getString(cursor.getColumnIndex("signData")); sign_user.delete_time = cursor.getString(cursor.getColumnIndex("delete_time")); sign_user.status = cursor.getInt(cursor.getColumnIndex("status")); sign_user.url = cursor.getString(cursor.getColumnIndex("url")); sign_user.referer_url = cursor.getString(cursor.getColumnIndex("referer_url")); sign_user.add_ip = cursor.getString(cursor.getColumnIndex("add_ip")); sign_user.add_time = cursor.getString(cursor.getColumnIndex("add_time")); sign_user.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name")); sign_user.update_ip = cursor.getString(cursor.getColumnIndex("update_ip")); sign_user.update_time = cursor.getString(cursor.getColumnIndex("update_time")); sign_user.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name")); sign_user.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY")); sign_user.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE")); sign_user.eating_habits = cursor.getString(cursor.getColumnIndex("eating_habits")); sign_user.update = cursor.getInt(cursor.getColumnIndex("update")); sign_user.longitude = cursor.getString(cursor.getColumnIndex("longitude")); sign_user.latitude = cursor.getString(cursor.getColumnIndex("latitude")); sign_user.deviceid = cursor.getString(cursor.getColumnIndex("deviceid")); // MLog.e("test","当前解析对象:"+sign_user.toString()); list.add(sign_user); } if (cursor!=null){ cursor.close(); } return list; } /** * 按照字段checked_time降序将sign_user对象查询出来 */ public List<Sign_User> orderBYDianM(int status,String snid) throws DbException { Cursor cursor = MyApplication.db.execQuery("SELECT * FROM sign_user WHERE status = '"+status+"' and snid = '"+snid+"'ORDER BY checked DESC,checked_time DESC"); List<Sign_User> list = new ArrayList<>(); while (cursor.moveToNext()){ Sign_User sign_user = new Sign_User(); sign_user._id = cursor.getInt(cursor.getColumnIndex("_id")); sign_user.snuid = cursor.getString(cursor.getColumnIndex("snuid")); sign_user.snid = cursor.getString(cursor.getColumnIndex("snid")); sign_user.mid = cursor.getInt(cursor.getColumnIndex("mid")); sign_user.lid = cursor.getInt(cursor.getColumnIndex("lid")); sign_user.userName = cursor.getString(cursor.getColumnIndex("userName")); sign_user.company = cursor.getString(cursor.getColumnIndex("company")); sign_user.phone = cursor.getString(cursor.getColumnIndex("phone")); sign_user.sex = cursor.getString(cursor.getColumnIndex("sex")); sign_user.email = cursor.getString(cursor.getColumnIndex("email")); sign_user.ivcode = cursor.getString(cursor.getColumnIndex("ivcode")); sign_user.checked = cursor.getString(cursor.getColumnIndex("checked")); sign_user.reason = cursor.getString(cursor.getColumnIndex("reason")); sign_user.checked_time = cursor.getString(cursor.getColumnIndex("checked_time")); sign_user.signData = cursor.getString(cursor.getColumnIndex("signData")); sign_user.delete_time = cursor.getString(cursor.getColumnIndex("delete_time")); sign_user.status = cursor.getInt(cursor.getColumnIndex("status")); sign_user.url = cursor.getString(cursor.getColumnIndex("url")); sign_user.referer_url = cursor.getString(cursor.getColumnIndex("referer_url")); sign_user.add_ip = cursor.getString(cursor.getColumnIndex("add_ip")); sign_user.add_time = cursor.getString(cursor.getColumnIndex("add_time")); sign_user.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name")); sign_user.update_ip = cursor.getString(cursor.getColumnIndex("update_ip")); sign_user.update_time = cursor.getString(cursor.getColumnIndex("update_time")); sign_user.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name")); sign_user.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY")); sign_user.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE")); sign_user.eating_habits = cursor.getString(cursor.getColumnIndex("eating_habits")); sign_user.update = cursor.getInt(cursor.getColumnIndex("update")); sign_user.longitude = cursor.getString(cursor.getColumnIndex("longitude")); sign_user.latitude = cursor.getString(cursor.getColumnIndex("latitude")); sign_user.deviceid = cursor.getString(cursor.getColumnIndex("deviceid")); // MLog.e("test","当前解析对象:"+sign_user.toString()); list.add(sign_user); } if (cursor!=null){ cursor.close(); } return list; } /** * 按照指定字段排序并解析出相应的任务列表 */ public List<TeamTask> orderBYtask(int status,HashMap<String,String> map,String condition) throws DbException { List<TeamTask> list = new ArrayList<>(); Cursor cursor; StringBuilder sb = new StringBuilder(); sb.append("SELECT * FROM teamtask WHERE status = '" + status+"'"); for (Map.Entry<String,String> entry:map.entrySet()) { sb.append("and "+entry.getKey()+"='"+entry.getValue()+"'"); } if (condition.equals("update_time")){ sb.append("ORDER BY update_time DESC"); // cursor = MyApplication.db.execQuery("SELECT * FROM teamtask WHERE status = '" + status + "' and mid = '" + mid + "' and tuid = '" + tuid + "'ORDER BY update_time DESC"); } if (condition.equals("endtime")){ sb.append("ORDER BY endtime DESC"); // cursor = MyApplication.db.execQuery("SELECT * FROM teamtask WHERE status = '" + status + "' and mid = '" + mid + "' and tuid = '" + tuid + "'ORDER BY endtime DESC"); } MLog.e("test","MyDbBase log:当前sql语句-"+sb.toString()); cursor = MyApplication.db.execQuery(sb.toString()); if (cursor!=null){ while (cursor.moveToNext()){//开始解析 TeamTask teamTask = new TeamTask(); teamTask._id = cursor.getInt(cursor.getColumnIndex("_id")); teamTask.tid = cursor.getInt(cursor.getColumnIndex("tid")); teamTask.mid = cursor.getInt(cursor.getColumnIndex("mid")); teamTask.parentid = cursor.getInt(cursor.getColumnIndex("parentid")); teamTask.tuid = cursor.getInt(cursor.getColumnIndex("tuid")); teamTask.creattuid = cursor.getInt(cursor.getColumnIndex("creattuid")); teamTask.typeid = cursor.getInt(cursor.getColumnIndex("typeid")); teamTask.startask = cursor.getInt(cursor.getColumnIndex("startask")); teamTask.title = cursor.getString(cursor.getColumnIndex("title")); teamTask.content = cursor.getString(cursor.getColumnIndex("content")); teamTask.attachment = cursor.getString(cursor.getColumnIndex("attachment")); teamTask.nickname = cursor.getString(cursor.getColumnIndex("nickname")); teamTask.creatnickname = cursor.getString(cursor.getColumnIndex("creatnickname")); teamTask.typename = cursor.getString(cursor.getColumnIndex("typename")); teamTask.starttime = cursor.getString(cursor.getColumnIndex("starttime")); teamTask.endtime = cursor.getString(cursor.getColumnIndex("endtime")); teamTask.mark = cursor.getString(cursor.getColumnIndex("mark")); teamTask.situation = cursor.getString(cursor.getColumnIndex("situation")); teamTask.delete_time = cursor.getString(cursor.getColumnIndex("delete_time")); teamTask.status = cursor.getInt(cursor.getColumnIndex("status")); teamTask.url = cursor.getString(cursor.getColumnIndex("url")); teamTask.referer_url = cursor.getString(cursor.getColumnIndex("referer_url")); teamTask.add_ip = cursor.getString(cursor.getColumnIndex("add_ip")); teamTask.add_time = cursor.getString(cursor.getColumnIndex("add_time")); teamTask.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name")); teamTask.update_ip = cursor.getString(cursor.getColumnIndex("update_ip")); teamTask.update_time = cursor.getString(cursor.getColumnIndex("update_time")); teamTask.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name")); teamTask.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY")); teamTask.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE")); list.add(teamTask); } cursor.close(); } return list; } /** * 按照指定字段排序并解析出相应的任务列表 */ public List<TeamTask> orderBYtaskstar(int status,int mid,int tuid,String condition) throws DbException { List<TeamTask> list = new ArrayList<>(); String strSql = "SELECT * FROM teamtask WHERE status = '" + status + "' and mid = '" + mid + "' and (tuid = '" + tuid + "' or ()ORDER BY update_time DESC"; Cursor cursor= MyApplication.db.execQuery(strSql); MLog.e("test","MyDbBase log:当前sql语句-"+strSql); if (cursor!=null){ while (cursor.moveToNext()){//开始解析 TeamTask teamTask = new TeamTask(); teamTask._id = cursor.getInt(cursor.getColumnIndex("_id")); teamTask.tid = cursor.getInt(cursor.getColumnIndex("tid")); teamTask.mid = cursor.getInt(cursor.getColumnIndex("mid")); teamTask.parentid = cursor.getInt(cursor.getColumnIndex("parentid")); teamTask.tuid = cursor.getInt(cursor.getColumnIndex("tuid")); teamTask.creattuid = cursor.getInt(cursor.getColumnIndex("creattuid")); teamTask.typeid = cursor.getInt(cursor.getColumnIndex("typeid")); teamTask.startask = cursor.getInt(cursor.getColumnIndex("startask")); teamTask.title = cursor.getString(cursor.getColumnIndex("title")); teamTask.content = cursor.getString(cursor.getColumnIndex("content")); teamTask.attachment = cursor.getString(cursor.getColumnIndex("attachment")); teamTask.nickname = cursor.getString(cursor.getColumnIndex("nickname")); teamTask.creatnickname = cursor.getString(cursor.getColumnIndex("creatnickname")); teamTask.typename = cursor.getString(cursor.getColumnIndex("typename")); teamTask.starttime = cursor.getString(cursor.getColumnIndex("starttime")); teamTask.endtime = cursor.getString(cursor.getColumnIndex("endtime")); teamTask.mark = cursor.getString(cursor.getColumnIndex("mark")); teamTask.situation = cursor.getString(cursor.getColumnIndex("situation")); teamTask.delete_time = cursor.getString(cursor.getColumnIndex("delete_time")); teamTask.status = cursor.getInt(cursor.getColumnIndex("status")); teamTask.url = cursor.getString(cursor.getColumnIndex("url")); teamTask.referer_url = cursor.getString(cursor.getColumnIndex("referer_url")); teamTask.add_ip = cursor.getString(cursor.getColumnIndex("add_ip")); teamTask.add_time = cursor.getString(cursor.getColumnIndex("add_time")); teamTask.add_user_name = cursor.getString(cursor.getColumnIndex("add_user_name")); teamTask.update_ip = cursor.getString(cursor.getColumnIndex("update_ip")); teamTask.update_time = cursor.getString(cursor.getColumnIndex("update_time")); teamTask.update_user_name = cursor.getString(cursor.getColumnIndex("update_user_name")); teamTask.SIGN_KEY = cursor.getString(cursor.getColumnIndex("SIGN_KEY")); teamTask.CAUSE = cursor.getString(cursor.getColumnIndex("CAUSE")); list.add(teamTask); } cursor.close(); } return list; } /** * 按时间降序排序推送消息 */ public List<Message> orderBYMessage(String tuid){ List<Message> list = new ArrayList<>(); String sql = "SELECT * FROM message WHERE tuid = '"+tuid+"' and _id != '0' ORDER BY time DESC"; MLog.e("test","当前sql语句:"+sql); try { Cursor cursor = MyApplication.db.execQuery(sql); if (cursor!=null){ while (cursor.moveToNext()){ Message msg = new Message(); msg._id = cursor.getInt(cursor.getColumnIndex("_id")); msg.tuid = cursor.getString(cursor.getColumnIndex("tuid")); msg.time = cursor.getString(cursor.getColumnIndex("time")); msg.title = cursor.getString(cursor.getColumnIndex("title")); msg.content = cursor.getString(cursor.getColumnIndex("content")); msg.isRead = cursor.getInt(cursor.getColumnIndex("isRead")); list.add(msg); } cursor.close(); } } catch (DbException e) { e.printStackTrace(); } return list; } /** * key: dbName */ private final static HashMap<DaoConfig, MyDbBase> DAO_MAP = new HashMap<DaoConfig, MyDbBase>(); private SQLiteDatabase database; private DaoConfig daoConfig; private boolean allowTransaction; private MyDbBase(DaoConfig config) { if (config == null) { throw new IllegalArgumentException("daoConfig may not be null"); } this.daoConfig = config; this.allowTransaction = config.isAllowTransaction(); this.database = openOrCreateDatabase(config); DbOpenListener dbOpenListener = config.getDbOpenListener(); if (dbOpenListener != null) { dbOpenListener.onDbOpened(this); } } public synchronized static DbManager getInstance(DaoConfig daoConfig) { if (daoConfig == null) {//使用默认配置 daoConfig = new DaoConfig(); } MyDbBase dao = DAO_MAP.get(daoConfig); if (dao == null) { dao = new MyDbBase(daoConfig); DAO_MAP.put(daoConfig, dao); } else { dao.daoConfig = daoConfig; } // update the database if needed SQLiteDatabase database = dao.database; int oldVersion = database.getVersion(); int newVersion = daoConfig.getDbVersion(); if (oldVersion != newVersion) { if (oldVersion != 0) { DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener(); if (upgradeListener != null) { upgradeListener.onUpgrade(dao, oldVersion, newVersion); } else { try { dao.dropDb(); } catch (DbException e) { LogUtil.e(e.getMessage(), e); } } } database.setVersion(newVersion); } return dao; } @Override public SQLiteDatabase getDatabase() { return database; } @Override public DaoConfig getDaoConfig() { return daoConfig; } //*********************************************** operations ******************************************************** @Override public void saveOrUpdate(Object entity) throws DbException { try { beginTransaction(); if (entity instanceof List) { List<?> entities = (List<?>) entity; if (entities.isEmpty()) return; TableEntity<?> table = this.getTable(entities.get(0).getClass()); createTableIfNotExist(table); for (Object item : entities) { saveOrUpdateWithoutTransaction(table, item); } } else { TableEntity<?> table = this.getTable(entity.getClass()); createTableIfNotExist(table); saveOrUpdateWithoutTransaction(table, entity); } setTransactionSuccessful(); } finally { endTransaction(); } } @Override public void replace(Object entity) throws DbException { try { beginTransaction(); if (entity instanceof List) { List<?> entities = (List<?>) entity; if (entities.isEmpty()) return; TableEntity<?> table = this.getTable(entities.get(0).getClass()); createTableIfNotExist(table); for (Object item : entities) { execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, item)); } } else { TableEntity<?> table = this.getTable(entity.getClass()); createTableIfNotExist(table); execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, entity)); } setTransactionSuccessful(); } finally { endTransaction(); } } @Override public void save(Object entity) throws DbException { try { beginTransaction(); if (entity instanceof List) { List<?> entities = (List<?>) entity; if (entities.isEmpty()) return; TableEntity<?> table = this.getTable(entities.get(0).getClass()); createTableIfNotExist(table); for (Object item : entities) { execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, item)); } } else { TableEntity<?> table = this.getTable(entity.getClass()); createTableIfNotExist(table); execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity)); } setTransactionSuccessful(); } finally { endTransaction(); } } @Override public boolean saveBindingId(Object entity) throws DbException { boolean result = false; try { beginTransaction(); if (entity instanceof List) { List<?> entities = (List<?>) entity; if (entities.isEmpty()) return false; TableEntity<?> table = this.getTable(entities.get(0).getClass()); createTableIfNotExist(table); for (Object item : entities) { if (!saveBindingIdWithoutTransaction(table, item)) { throw new DbException("saveBindingId error, transaction will not commit!"); } } } else { TableEntity<?> table = this.getTable(entity.getClass()); createTableIfNotExist(table); result = saveBindingIdWithoutTransaction(table, entity); } setTransactionSuccessful(); } finally { endTransaction(); } return result; } @Override public void deleteById(Class<?> entityType, Object idValue) throws DbException { TableEntity<?> table = this.getTable(entityType); if (!table.tableIsExist()) return; try { beginTransaction(); execNonQuery(SqlInfoBuilder.buildDeleteSqlInfoById(table, idValue)); setTransactionSuccessful(); } finally { endTransaction(); } } @Override public void delete(Object entity) throws DbException { try { beginTransaction(); if (entity instanceof List) { List<?> entities = (List<?>) entity; if (entities.isEmpty()) return; TableEntity<?> table = this.getTable(entities.get(0).getClass()); if (!table.tableIsExist()) return; for (Object item : entities) { execNonQuery(SqlInfoBuilder.buildDeleteSqlInfo(table, item)); } } else { TableEntity<?> table = this.getTable(entity.getClass()); if (!table.tableIsExist()) return; execNonQuery(SqlInfoBuilder.buildDeleteSqlInfo(table, entity)); } setTransactionSuccessful(); } finally { endTransaction(); } } @Override public void delete(Class<?> entityType) throws DbException { delete(entityType, null); } @Override public int delete(Class<?> entityType, WhereBuilder whereBuilder) throws DbException { TableEntity<?> table = this.getTable(entityType); if (!table.tableIsExist()) return 0; int result = 0; try { beginTransaction(); result = executeUpdateDelete(SqlInfoBuilder.buildDeleteSqlInfo(table, whereBuilder)); setTransactionSuccessful(); } finally { endTransaction(); } return result; } @Override public void update(Object entity, String... updateColumnNames) throws DbException { try { beginTransaction(); if (entity instanceof List) { List<?> entities = (List<?>) entity; if (entities.isEmpty()) return; TableEntity<?> table = this.getTable(entities.get(0).getClass()); if (!table.tableIsExist()) return; for (Object item : entities) { execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, item, updateColumnNames)); } } else { TableEntity<?> table = this.getTable(entity.getClass()); if (!table.tableIsExist()) return; execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, entity, updateColumnNames)); } setTransactionSuccessful(); } finally { endTransaction(); } } @Override public int update(Class<?> entityType, WhereBuilder whereBuilder, KeyValue... nameValuePairs) throws DbException { TableEntity<?> table = this.getTable(entityType); if (!table.tableIsExist()) return 0; int result = 0; try { beginTransaction(); result = executeUpdateDelete(SqlInfoBuilder.buildUpdateSqlInfo(table, whereBuilder, nameValuePairs)); setTransactionSuccessful(); } finally { endTransaction(); } return result; } @Override @SuppressWarnings("unchecked") public <T> T findById(Class<T> entityType, Object idValue) throws DbException { return null; } @Override public <T> T findFirst(Class<T> entityType) throws DbException { return this.selector(entityType).findFirst(); } @Override public <T> List<T> findAll(Class<T> entityType) throws DbException { return this.selector(entityType).findAll(); } @Override public <T> Selector<T> selector(Class<T> entityType) throws DbException { return null; } @Override public DbModel findDbModelFirst(SqlInfo sqlInfo) throws DbException { return null; } @Override public List<DbModel> findDbModelAll(SqlInfo sqlInfo) throws DbException { return null; } //******************************************** config ****************************************************** private SQLiteDatabase openOrCreateDatabase(DaoConfig config) { SQLiteDatabase result = null; File dbDir = config.getDbDir(); if (dbDir != null && (dbDir.exists() || dbDir.mkdirs())) { File dbFile = new File(dbDir, config.getDbName()); result = SQLiteDatabase.openOrCreateDatabase(dbFile, null); } else { result = x.app().openOrCreateDatabase(config.getDbName(), 0, null); } return result; } //***************************** private operations with out transaction ***************************** private void saveOrUpdateWithoutTransaction(TableEntity<?> table, Object entity) throws DbException { ColumnEntity id = table.getId(); if (id.isAutoId()) { if (id.getColumnValue(entity) != null) { execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, entity)); } else { saveBindingIdWithoutTransaction(table, entity); } } else { execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, entity)); } } private boolean saveBindingIdWithoutTransaction(TableEntity<?> table, Object entity) throws DbException { ColumnEntity id = table.getId(); if (id.isAutoId()) { execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity)); long idValue = getLastAutoIncrementId(table.getName()); if (idValue == -1) { return false; } id.setAutoIdValue(entity, idValue); return true; } else { execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity)); return true; } } //************************************************ tools *********************************** private long getLastAutoIncrementId(String tableName) throws DbException { long id = -1; Cursor cursor = execQuery("SELECT seq FROM sqlite_sequence WHERE name='" + tableName + "' LIMIT 1"); if (cursor != null) { try { if (cursor.moveToNext()) { id = cursor.getLong(0); } } catch (Throwable e) { throw new DbException(e); } finally { IOUtil.closeQuietly(cursor); } } return id; } @Override public void close() throws IOException { if (DAO_MAP.containsKey(daoConfig)) { DAO_MAP.remove(daoConfig); this.database.close(); } } / exec sql / private void beginTransaction() { if (allowTransaction) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && database.isWriteAheadLoggingEnabled()) { database.beginTransactionNonExclusive(); } else { database.beginTransaction(); } } } private void setTransactionSuccessful() { if (allowTransaction) { database.setTransactionSuccessful(); } } private void endTransaction() { if (allowTransaction) { database.endTransaction(); } } @Override public int executeUpdateDelete(SqlInfo sqlInfo) throws DbException { SQLiteStatement statement = null; try { statement = sqlInfo.buildStatement(database); return statement.executeUpdateDelete(); } catch (Throwable e) { throw new DbException(e); } finally { if (statement != null) { try { statement.releaseReference(); } catch (Throwable ex) { LogUtil.e(ex.getMessage(), ex); } } } } @Override public int executeUpdateDelete(String sql) throws DbException { SQLiteStatement statement = null; try { statement = database.compileStatement(sql); return statement.executeUpdateDelete(); } catch (Throwable e) { throw new DbException(e); } finally { if (statement != null) { try { statement.releaseReference(); } catch (Throwable ex) { LogUtil.e(ex.getMessage(), ex); } } } } @Override public void execNonQuery(SqlInfo sqlInfo) throws DbException { SQLiteStatement statement = null; try { statement = sqlInfo.buildStatement(database); statement.execute(); } catch (Throwable e) { throw new DbException(e); } finally { if (statement != null) { try { statement.releaseReference(); } catch (Throwable ex) { LogUtil.e(ex.getMessage(), ex); } } } } @Override public void execNonQuery(String sql) throws DbException { try { database.execSQL(sql); } catch (Throwable e) { throw new DbException(e); } } @Override public Cursor execQuery(SqlInfo sqlInfo) throws DbException { try { return database.rawQuery(sqlInfo.getSql(), sqlInfo.getBindArgsAsStrArray()); } catch (Throwable e) { throw new DbException(e); } } @Override public Cursor execQuery(String sql) throws DbException { try { return database.rawQuery(sql, null); } catch (Throwable e) { throw new DbException(e); } } } 使用的时候:
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<Object> 进行批量删除。
3:改
void update(Object entity, String... updateColumnNames) throws DbException; 这里需要注意的是:如果你拿到一个新的对象,你想更新里面所有的字段值,那就直接把对象放进去(你放进去的对象的主键一定要和你本地数据库需要更新德尔那个对象的主键保持一致,如果这个对象没有主键一定需要赋值,不然会抛异常,xutils3所有的数据库操作除了单纯的插入,其他都需要有主键才能进行的,话说sqlite都一样啊,我这里只是友情提示一下),后面的可变长度的参数不赋值就好;如果你只想更新部分字段那你只需要这么操作,这里也可以传入一个List<Object> 进行批量更新。
String[] s = {"column2","column3"}; MyApplication.db.update(test1,s);//这样就能达到只更新两个字段值得效果 4:查
<T> Selector<T> selector(Class<T> entityType) throws DbException; xutils3的查询数据库的操作采用了经典的建造者模式,使用起来非常方便,事例如下:
try { List<Test> 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<Test> 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<Test> 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); } }
