3. Android框架和工具之 xUtils(DbUtils )
1. xUtils简介
xUtils 包含了很多实用的android工具。xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...
xUtils 下载地址为:https://github.com/wyouflf/xUtils
xUtils最低兼容android 2.2 (API level 8)。 当前xUtils主要有四大模块:
(1)DbUtils 模块
- android中的orm框架,一行代码就可以进行增删改查;
- 支持事务,默认关闭;
- 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
- 支持绑定外键,保存实体时外键关联实体自动保存或更新;
- 自动加载外键关联实体,支持延时加载;
- 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。
(2)ViewUtils 模块
- android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定;
- 新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
- 目前支持常用的11种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
(3)HttpUtils 模块
- 支持同步,异步方式的请求;
- 支持大文件上传,上传大文件不会oom;
- 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD请求;
- 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
- 返回文本内容的GET请求支持缓存,可设置默认过期时间和针对当前请求的过期时间。
(4)BitmapUtils 模块
- 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
- 支持加载网络图片和本地图片;
- 内存管理使用lru算法,更好的管理bitmap内存;
- 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...
2. 注意:
使用xUtils快速开发框架需要有以下权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
混淆时注意事项:
- 不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }
- 对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name="xxx"),@Id(column="xxx"),@Column(column="xxx"),@Foreign(column="xxx",foreign="xxx");
3. DbUtils基本使用:
(1)首先我们新建一个Android工程,命名为"DbUtils",如下:
(2)首先我们来到主布局文件,如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:context="com.himi.xutils.MainActivity" > 7 8 <Button 9 android:text="添加" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:id="@+id/add"/> 13 <Button 14 android:text="删除" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:id="@+id/delete"/> 18 <Button 19 android:text="修改" 20 android:layout_width="match_parent" 21 android:layout_height="wrap_content" 22 android:id="@+id/update"/> 23 <Button 24 android:text="查询" 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content" 27 android:id="@+id/query"/>" 28 29 </LinearLayout>
(3)同时我们这里需要使用xUtils工具,需要到https://github.com/wyouflf/xUtils 处下载xuils工具包,下载解压如下:
与此同时,我们需要到AndroidManifest之中添加使用xutils的权限,如下:
(4)接下来当然是使用DbxUtils,来到MainActivity,如下:
1 package com.himi.dbutils; 2 3 import java.util.List; 4 5 import com.himi.dbutils.bean.Parent; 6 import com.himi.xutils.R; 7 import com.lidroid.xutils.DbUtils; 8 import com.lidroid.xutils.db.sqlite.Selector; 9 import com.lidroid.xutils.db.sqlite.WhereBuilder; 10 import com.lidroid.xutils.exception.DbException; 11 12 import android.app.Activity; 13 import android.os.Bundle; 14 import android.view.View; 15 import android.view.View.OnClickListener; 16 import android.widget.Button; 17 18 public class MainActivity extends Activity { 19 private Button add; 20 private Button delete; 21 private Button update; 22 private Button query; 23 24 private DbUtils db; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 31 add = (Button) findViewById(R.id.add); 32 delete = (Button) findViewById(R.id.delete); 33 update = (Button) findViewById(R.id.update); 34 query = (Button) findViewById(R.id.query); 35 36 db = DbUtils.create(this); 37 38 initEvents(); 39 } 40 41 private void initEvents() { 42 // TODO Auto-generated method stub 43 44 /** 45 * 添加数据 46 */ 47 add.setOnClickListener(new OnClickListener() { 48 49 @Override 50 public void onClick(View v) { 51 52 try { 53 if(db.findAll(Parent.class) == null) { 54 Parent parent1 = new Parent(); 55 parent1.setEmail("12222222@qq.com"); 56 parent1.setName("Tom"); 57 parent1.setAge(23); 58 59 Parent parent2 = new Parent(); 60 parent2.setEmail("674747@qq.com"); 61 parent2.setName("Kaka"); 62 parent2.setAge(16); 63 64 Parent parent3 = new Parent(); 65 parent3.setEmail("132445@qq.com"); 66 parent3.setName("Messci"); 67 parent3.setAge(34); 68 69 Parent parent4 = new Parent(); 70 parent4.setEmail("76825672@qq.com"); 71 parent4.setName("LuoDO"); 72 parent4.setAge(21); 73 74 75 db.save(parent1); 76 db.save(parent2); 77 db.save(parent3); 78 db.save(parent4); 79 } 80 } catch (DbException e) { 81 // TODO Auto-generated catch block 82 e.printStackTrace(); 83 } 84 } 85 }); 86 87 //删除数据 88 delete.setOnClickListener(new OnClickListener() { 89 90 @Override 91 public void onClick(View v) { 92 /** 93 * public void deleteById(java.lang.Class<?> entityType, 94 * java.lang.Object idValue) 95 * 参数:entityType - 实体类类型 96 * 参数:idValue - 主键的值 97 * 98 * public void delete(java.lang.Object entity) 99 * 参数:entity - 实体类实例 100 * 101 * public void delete(java.lang.Class<?> entityType, 102 * WhereBuilder whereBuilder) 103 * 参数:entityType - 实体类类型 104 * 参数:whereBuilder - WHERE条件WhereBuilder 105 * 106 * public void deleteAll(java.util.List<?> entities) 107 * 参数:entities - 实体类实例集合 108 * 109 * public void deleteAll(java.lang.Class<?> entityType) 110 * 参数:entityType - 实体类类型 111 * 112 */ 113 114 try { 115 db.delete(Parent.class, WhereBuilder.b("name", "=", "LuoDO")); 116 } catch (DbException e) { 117 // TODO Auto-generated catch block 118 e.printStackTrace(); 119 } 120 121 } 122 }); 123 124 //修改数据 125 126 update.setOnClickListener(new OnClickListener() { 127 128 @Override 129 public void onClick(View v) { 130 /** 131 * public void update(java.lang.Object entity, 132 * java.lang.String... updateColumnNames) 133 * 参数:entity - 实体类实例 134 * 参数:updateColumnNames - 需要更新的字段名 135 * 136 * public void update(java.lang.Object entity, WhereBuilder whereBuilder, 137 * java.lang.String... updateColumnNames) 138 * 参数:entity - 实体类实例 139 * 参数:whereBuilder - WHERE条件WhereBuilder 140 * 参数:updateColumnNames - 需要更新的字段名 141 * 142 * public void updateAll(java.util.List<?> entities, 143 * java.lang.String... updateColumnNames) 144 * 参数:entities - 实体类实例集合 145 * 参数:updateColumnNames - 需要更新的字段名 146 * 147 * public void updateAll(java.util.List<?> entities, 148 * WhereBuilder whereBuilder, 149 * java.lang.String... updateColumnNames) 150 * 参数:entities - 实体类实例集合 151 * 参数:whereBuilder - WHERE条件WhereBuilder 152 * 参数:updateColumnNames - 需要更新的字段名 153 * 154 */ 155 try { 156 List<Parent> lists = db.findAll(Selector.from(Parent.class)); 157 Parent p = lists.get(0); 158 p.setName("hebao"); 159 db.update(p, "name"); 160 } catch (DbException e) { 161 // TODO Auto-generated catch block 162 e.printStackTrace(); 163 } 164 165 } 166 }); 167 //查询数据 168 query.setOnClickListener(new OnClickListener() { 169 170 @Override 171 public void onClick(View v) { 172 /** 173 * public <T> T findById(java.lang.Class<T> entityType, 174 * java.lang.Object idValue) 175 * 参数:entityType - 实体类类型 176 * 参数:idValue - 主键ID的值(值为空时,抛出异常DbException) 177 * 178 * public <T> T findFirst(Selector selector) 179 * 参数:selector - SQL查询条件描述 Selector 180 * 181 * public <T> T findFirst(java.lang.Class<T> entityType) 182 * 参数:entityType - 实体类类型Class 183 * 184 * public <T> java.util.List<T> findAll(Selector selector) 185 * 参数:selector - SQL查询条件描述 Selector 186 * 187 * public <T> java.util.List<T> findAll(java.lang.Class<T> entityType) 188 * 参数:entityType - 实体类类型Class 189 * 190 */ 191 try { 192 //通过类型查找 193 List<Parent> lists = db.findAll(Parent.class); 194 //遍历lists 195 for(int x=0; x<lists.size(); x++) { 196 Parent p = (Parent)lists.get(x); 197 System.out.println("Id: "+p.getId()+" Name:"+p.getName()+" Email:"+p.getEmail()); 198 } 199 200 Parent p1 = db.findFirst(Selector.from(Parent.class). 201 where("name","=","Tom")); 202 System.out.println("Tom:"+"id"+"---"+p1.getId()); 203 204 List<Parent> lists1 = db.findAll(Selector.from(Parent.class) 205 .where("id","<",4) 206 .and(WhereBuilder.b("age", ">", 20)) 207 .orderBy("id")); 208 //遍历lists1 209 for(int x=0; x<lists1.size(); x++) { 210 Parent p = (Parent)lists1.get(x); 211 System.out.println("Id: "+p.getId()+" Name:"+p.getName()+" Email:"+p.getEmail()); 212 } 213 214 215 216 } catch (DbException e) { 217 // TODO Auto-generated catch block 218 e.printStackTrace(); 219 } 220 221 } 222 }); 223 224 225 } 226 227 228 }
(5)布署程序到手机上,同时观察Logcat,如下:
- 点击" 添加 ",然后再点击" 查询 ",如下:
- 点击" 修改",然后再点击"查询",如下:
- 点击"删除",然后点击"查询",如下: