您的位置:首页 > 移动开发 > Android开发

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

2016-04-26 16:06 459 查看
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. [b]DbUtils基本使用:[/b]

[b](1)首先我们新建一个Android工程,命名为"DbUtils",如下:



[/b]

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

 <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工具包,下载解压如下:







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





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



[b]点击" 添加 ",然后再[/b]点击" 查询 ",如下:





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





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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: