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,如下:

  • 点击" 添加 ",然后再点击" 查询 ",如下:

  • 点击" 修改",然后再点击"查询",如下:

  • 点击"删除",然后点击"查询",如下:

 

 

 

posted on 2016-04-26 16:06  鸿钧老祖  阅读(712)  评论(0编辑  收藏  举报

导航