3. Android框架和工具之 xUtils(DbUtils )

时间:2023-06-04 09:53:26

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",如下:
3. Android框架和工具之 xUtils(DbUtils )

(2)首先我们来到主布局文件,如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.himi.xutils.MainActivity" > <Button
android:text="添加"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/add"/>
<Button
android:text="删除"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/delete"/>
<Button
android:text="修改"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/update"/>
<Button
android:text="查询"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/query"/>" </LinearLayout>

 (3)同时我们这里需要使用xUtils工具,需要到https://github.com/wyouflf/xUtils 处下载xuils工具包,下载解压如下:

3. Android框架和工具之 xUtils(DbUtils )

3. Android框架和工具之 xUtils(DbUtils )

与此同时,我们需要到AndroidManifest之中添加使用xutils的权限,如下:

3. Android框架和工具之 xUtils(DbUtils )

(4)接下来当然是使用DbxUtils,来到MainActivity,如下:

 package com.himi.dbutils;

 import java.util.List;

 import com.himi.dbutils.bean.Parent;
import com.himi.xutils.R;
import com.lidroid.xutils.DbUtils;
import com.lidroid.xutils.db.sqlite.Selector;
import com.lidroid.xutils.db.sqlite.WhereBuilder;
import com.lidroid.xutils.exception.DbException; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity {
private Button add;
private Button delete;
private Button update;
private Button query; private DbUtils db; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); add = (Button) findViewById(R.id.add);
delete = (Button) findViewById(R.id.delete);
update = (Button) findViewById(R.id.update);
query = (Button) findViewById(R.id.query); db = DbUtils.create(this); initEvents();
} private void initEvents() {
// TODO Auto-generated method stub /**
* 添加数据
*/
add.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { try {
if(db.findAll(Parent.class) == null) {
Parent parent1 = new Parent();
parent1.setEmail("12222222@qq.com");
parent1.setName("Tom");
parent1.setAge(23); Parent parent2 = new Parent();
parent2.setEmail("674747@qq.com");
parent2.setName("Kaka");
parent2.setAge(16); Parent parent3 = new Parent();
parent3.setEmail("132445@qq.com");
parent3.setName("Messci");
parent3.setAge(34); Parent parent4 = new Parent();
parent4.setEmail("76825672@qq.com");
parent4.setName("LuoDO");
parent4.setAge(21); db.save(parent1);
db.save(parent2);
db.save(parent3);
db.save(parent4);
}
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}); //删除数据
delete.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
/**
* public void deleteById(java.lang.Class<?> entityType,
* java.lang.Object idValue)
* 参数:entityType - 实体类类型
* 参数:idValue - 主键的值
*
* public void delete(java.lang.Object entity)
* 参数:entity - 实体类实例
*
* public void delete(java.lang.Class<?> entityType,
* WhereBuilder whereBuilder)
* 参数:entityType - 实体类类型
* 参数:whereBuilder - WHERE条件WhereBuilder
*
* public void deleteAll(java.util.List<?> entities)
* 参数:entities - 实体类实例集合
*
* public void deleteAll(java.lang.Class<?> entityType)
* 参数:entityType - 实体类类型
*
*/ try {
db.delete(Parent.class, WhereBuilder.b("name", "=", "LuoDO"));
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}); //修改数据 update.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
/**
* public void update(java.lang.Object entity,
* java.lang.String... updateColumnNames)
* 参数:entity - 实体类实例
* 参数:updateColumnNames - 需要更新的字段名
*
* public void update(java.lang.Object entity, WhereBuilder whereBuilder,
* java.lang.String... updateColumnNames)
* 参数:entity - 实体类实例
* 参数:whereBuilder - WHERE条件WhereBuilder
* 参数:updateColumnNames - 需要更新的字段名
*
* public void updateAll(java.util.List<?> entities,
* java.lang.String... updateColumnNames)
* 参数:entities - 实体类实例集合
* 参数:updateColumnNames - 需要更新的字段名
*
* public void updateAll(java.util.List<?> entities,
* WhereBuilder whereBuilder,
* java.lang.String... updateColumnNames)
* 参数:entities - 实体类实例集合
* 参数:whereBuilder - WHERE条件WhereBuilder
* 参数:updateColumnNames - 需要更新的字段名
*
*/
try {
List<Parent> lists = db.findAll(Selector.from(Parent.class));
Parent p = lists.get(0);
p.setName("hebao");
db.update(p, "name");
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
});
//查询数据
query.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
/**
* public <T> T findById(java.lang.Class<T> entityType,
* java.lang.Object idValue)
* 参数:entityType - 实体类类型
* 参数:idValue - 主键ID的值(值为空时,抛出异常DbException)
*
* public <T> T findFirst(Selector selector)
* 参数:selector - SQL查询条件描述 Selector
*
* public <T> T findFirst(java.lang.Class<T> entityType)
* 参数:entityType - 实体类类型Class
*
* public <T> java.util.List<T> findAll(Selector selector)
* 参数:selector - SQL查询条件描述 Selector
*
* public <T> java.util.List<T> findAll(java.lang.Class<T> entityType)
* 参数:entityType - 实体类类型Class
*
*/
try {
//通过类型查找
List<Parent> lists = db.findAll(Parent.class);
//遍历lists
for(int x=0; x<lists.size(); x++) {
Parent p = (Parent)lists.get(x);
System.out.println("Id: "+p.getId()+" Name:"+p.getName()+" Email:"+p.getEmail());
} Parent p1 = db.findFirst(Selector.from(Parent.class).
where("name","=","Tom"));
System.out.println("Tom:"+"id"+"---"+p1.getId()); List<Parent> lists1 = db.findAll(Selector.from(Parent.class)
.where("id","<",4)
.and(WhereBuilder.b("age", ">", 20))
.orderBy("id"));
//遍历lists1
for(int x=0; x<lists1.size(); x++) {
Parent p = (Parent)lists1.get(x);
System.out.println("Id: "+p.getId()+" Name:"+p.getName()+" Email:"+p.getEmail());
} } catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}); } }

(5)布署程序到手机上,同时观察Logcat,如下:

3. Android框架和工具之 xUtils(DbUtils )

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

3. Android框架和工具之 xUtils(DbUtils )

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

3. Android框架和工具之 xUtils(DbUtils )

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

3. Android框架和工具之 xUtils(DbUtils )