Android xutil3.0完全解析

转载自:http://www.androidchina.net/4177.html?utm_source=tuicool&utm_medium=referral  Android开发中文站 »xUtils更新到3.0后的基本使用规则

说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没有解决加载自定义ImageView报错的问题。

我总是喜欢用一些最新的东西,xUtils 3.0才刚更新,是一次比较大的重构,对于百度到的使用规则,基本都是3.0以前的,使得用3.0的开发者需要求解用法的时候,遇到许多阻碍,故此在这里简单介绍xUtils 3.0的使用规则。关于怎么导入功能,其实并不是本文的内容,不过在此文最后一节简单讲解了一下导入的方式。

1.xUtils中的IOC框架

使用xUtils的第一步就是必须创建自己的Application类,代码如下:

1
2
3
4
5
6
7
public class LYJApplication extends Application {
    @Override
    public void onCreate() {
        super .onCreate();
        x.Ext.init( this ); //Xutils初始化
    }
}

在AndroidManifest.xml的application标签中添加如下代码:

android:name=”.LYJApplication”

这样初始化就算完成了。

使用IOC框架的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
@ContentView (value = R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
    @ViewInject (value = R.id.mybut)
    private Button mybut;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super .onCreate(savedInstanceState);
        x.view().inject( this );
    }
    @Event (value = R.id.mybut,type = View.OnClickListener. class )
    private void onButtonClick(View v){
        switch (v.getId()){
            case R.id.mybut:
                Toast.makeText( this , "你好我是Xutils的IOC功能" ,Toast.LENGTH_SHORT).show();
                break ;
        }
    }
}

需要解释的以下几点:

其一:使用IOC必须全部为私有,不然无效,这里就做演示了,不信你可以把用到IOC框架的注解的成员变量及方法全部换成public ,那么全部会无效,当然除了ContentView例外。

其二,所有用到IOC成员变量,使用的时候,必须在x.view().inject(this)后,如果写在前面,那么程序会崩溃。

2.xUtils加载图片功能

现在我们需要设置两个权限,如下:

1
2
< uses-permission android:name = "android.permission.INTERNET" />
< uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />

接下来就是加载网络图片到imageView中:

x.image().bind(image,”http://pic.baike.soso.com/p/20090711/20090711101754-314944703.jpg“);

也可以设置参数:

1
2
3
4
5
6
7
8
9
ImageOptions imageOptions = new ImageOptions.Builder()
        .setSize(DensityUtil.dip2px( 120 ), DensityUtil.dip2px( 120 )) //图片大小
        .setRadius(DensityUtil.dip2px( 5 )) //ImageView圆角半径
        .setCrop( true ) // 如果ImageView的大小不是定义为wrap_content, 不要crop.
        .setImageScaleType(ImageView.ScaleType.CENTER_CROP)
        .setLoadingDrawableId(R.mipmap.ic_launcher) //加载中默认显示图片
        .setFailureDrawableId(R.mipmap.ic_launcher) //加载失败后默认显示图片
        .build();

你也可以将第2个参数设置为图片文件路径,那么将从SD卡中加载图片。

3.xUtils操作数据库

我们都知道,一个App中操作数据库的地方有很多,就像是否登录一样,有些地方必须登录后才能操作,那么肯定是全局变量,所以,必须将数据库的初始化放在Application,且必须提供获取数据库的方法,使得在应用程序的任何地方都可以直接获取数据库,并操作数据库,不然重复的获取与释放只能增加内存无谓的消耗。

初始化数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class LYJApplication extends Application {
    private DbManager.DaoConfig daoConfig;
    public DbManager.DaoConfig getDaoConfig() {
        return daoConfig;
    }
    @Override
    public void onCreate() {
        super .onCreate();
        x.Ext.init( this ); //Xutils初始化
        daoConfig = new DbManager.DaoConfig()
                .setDbName( "lyj_db" ) //创建数据库的名称
                .setDbVersion( 1 ) //数据库版本号
                .setDbUpgradeListener( new DbManager.DbUpgradeListener() {
                    @Override
                    public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
                        // TODO: ...
                        // db.addColumn(...);
                        // db.dropTable(...);
                        // ...
                    }
                }); //数据库更新操作
    }
}

上面的注释明了,有必要说明的一点是setDbDir(new File(“/sdcard”)),可以将数据库存储在你想存储的地方,如果不设置,那么数据库默认存储在/data/data/你的应用程序/database/xxx.db下。这里我们就默认放在应用程序下。

我们首先创建一个实体类,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Table (name= "lyj_person" )
public class LYJPerson {
    @Column (name = "id" , isId = true )
    private int id;
    @Column (name = "name" )
    private String name;
    @Column (name = "age" )
    private String age;
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this .age = age;
    }
    public int getId() {
        return id;
    }
    public void setId( int id) {
        this .id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this .name = name;
    }
}

通过实体类可以直接操作数据库。

我们在Application中加入如下代码,向数据库添加数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
DbManager db = x.getDb(daoConfig);
LYJPerson person1= new LYJPerson();
person1.setName( "liyuanjinglyj" );
person1.setAge( "23" );
LYJPerson person2= new LYJPerson();
person2.setName( "xutilsdemo" );
person2.setAge( "56" );
try {
    db.save(person1);
    db.save(person2);
} catch (DbException e) {
    e.printStackTrace();
}

在Activity中操作获取数据库数据的代码如下:

1
2
3
4
5
6
7
8
9
10
DbManager db = x.getDb(((LYJApplication)getApplicationContext()).getDaoConfig());
try {
    List&lt;LYJPerson&gt; lyjPersons=db.selector(LYJPerson. class ).findAll();
    for ( int i= 0 ;i&lt;lyjPersons.size();i++){
        Log.i( "liyuanjinglyj" , "LYJPerson" +i+ ".name=" +lyjPersons.get(i).getName());
        Log.i( "liyuanjinglyj" , "LYJPerson" +i+ ".name=" +lyjPersons.get(i).getAge());
    }
} catch (DbException e) {
    e.printStackTrace();
}

那么肯定会得到如下结果:

4.xUtils的网络请求

Android规定UI线程是不能涉及网络任务的,所以,这里主要简单介绍Xutils的异步网络请求,同步的自行探究。

使用格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
RequestParams params = new RequestParams( "http://blog.csdn.net/mobile/experts.html" );
x.http().get(params, new Callback.CommonCallback&lt;String&gt;() {
    @Override
    public void onSuccess(String result) {
        Document doc = Jsoup.parse(result);
        Element div = doc.select( "div.list_3" ).get( 0 );
        Elements imgs = div.getElementsByTag( "img" );
        for ( int i = 0 ; i &lt; imgs.size(); i++) {
            Element img = imgs.get(i);
            Log.i( "liyuanjinglyj" ,img.attr( "alt" ));
        }
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    @Override
    public void onCancelled(Callback.CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
});

这里获取的是CSDN移动博客专家的HTML页面信息,看看下面的日志,就知道Xutils网络功能还是很强大的。

本文最后附带了一下粗略模仿CSDN APP的源码,有意者可以下载看看,里面用到另一个开发框架,我用来专门处理图片的(afinal)。都说xUtils是afinal的进化版,不过在图片方面,我们觉得xUtils还有点不足。

http://download.csdn.net/detail/liyuanjinglyj/9379103

5.导入xUtils工程到Android Studio

下载地址如下:

https://github.com/wyouflf/xUtils3/tree/master

㈠将下载的工程复制到Project目录下:

㈡添加到settings.gradle文件:

include ‘:app’,':xutils’

㈢编译到工程中

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile project(':xutils')
}

㈣将xutils文件夹下的build.gradle中的版本与最低版本调整到与创建工程一致

compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 20151224
    versionName version
}

㈤添加如下代码到build.gradle(Project:XutilsDemo)中

dependencies {
    classpath 'com.android.tools.build:gradle:1.3.0'
    classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
    classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

其中红色标记为添加的代码。

点击Sync now就可以使用xUtils了。

 

 

转载自:http://blog.csdn.net/a1002450926/article/details/50341173

今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示。相信大家对这个框架也都了解过,下面简单介绍下XUtils3的一些基本知识。

XUtils3一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。

使用XUtils只需要在libs文件夹里面加入一个jar包,如果对服务器返回的数据进行封装的话,还需要导入一个Gson的jar包。

  1. <uses-permission android:name="android.permission.INTERNET" />   
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" />  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


 

注解模块

Activity的注解
1.在Application的oncreate方法中加入下面代码:
x.Ext.init(this);
2.在Activity的oncreate方法中加入下面代码:
x.view().inject(this);
3.加载当前的Activity布局需要如下注解:
@ContentView加入到Activity的上方
4.给View进行初始化需要如下注解:
@InjectView
5.处理控件的各种响应事件需要如下注解:
@Envent

  1. @ContentView(R.layout.activity_main) 
  2. public class MainActivity extends ActionBarActivity { 
  3.  
  4.     @ViewInject(R.id.btn_get) 
  5.     Button btn_get; 
  6.     @ViewInject(R.id.btn_post) 
  7.     Button btn_post; 
  8.  
  9.     @Override 
  10.     protected void onCreate(Bundle savedInstanceState) { 
  11.         super.onCreate(savedInstanceState); 
  12.         x.view().inject(this); 
  13.  
  14.         btn_get.setText("发送get请求"); 
  15.         btn_post.setText("发送post请求"); 
  16.     } 
  17.     //等同于@Event(value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class) 
  18.     @Event(value={R.id.btn_get,R.id.btn_post}) 
  19.     private void getEvent(View view){ 
  20.         switch(view.getId()){ 
  21.         case R.id.btn_get: 
  22.             Toast.makeText(MainActivity.this, btn_get.getText().toString().trim(), 0).show(); 
  23.             break
  24.         case R.id.btn_post: 
  25.             Toast.makeText(MainActivity.this, btn_post.getText().toString().trim(), 0).show(); 
  26.             break
  27.         } 
  28.     } 
@ContentView(R.layout.activity_main)
public class MainActivity extends ActionBarActivity {

    @ViewInject(R.id.btn_get)
    Button btn_get;
    @ViewInject(R.id.btn_post)
    Button btn_post;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);

        btn_get.setText("发送get请求");
        btn_post.setText("发送post请求");
    }
    //等同于@Event(value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class)
    @Event(value={R.id.btn_get,R.id.btn_post})
    private void getEvent(View view){
        switch(view.getId()){
        case R.id.btn_get:
            Toast.makeText(MainActivity.this, btn_get.getText().toString().trim(), 0).show();
            break;
        case R.id.btn_post:
            Toast.makeText(MainActivity.this, btn_post.getText().toString().trim(), 0).show();
            break;
        }
    }


通过测试,我们发现当点击btn_get按钮时,弹出了“发送get请求”的效果。到这里,大家算是对XUtils的注解有个一个基本的认识,下面我在强调一点的是,@Event这个注解默认情况下type属性为View.OnClickListener.class.如果你想实现其余点击事件效果,只需要把type值进行修改即可。
另外需要注意的一点是按钮的点击事件必须用private进行修饰。

Fragment的注解:

  1. @ContentView(R.layout.fragment_first)   
  2. public class FirstFragment extends Fragment{   
  3.     private MyAdapter adapter; 
  4.     private List<Person> list=new ArrayList<>();   
  5.     private List<String> listUrl=new ArrayList<>();   
  6.     private List<String> listName=new ArrayList<>();     
  7.  
  8.     @ViewInject(R.id.btn_test) 
  9.     Button btn_test; 
  10.     @ViewInject(R.id.listView) 
  11.     ListView listView; 
  12.  
  13.     @Override 
  14.     public View onCreateView(LayoutInflater inflater, 
  15.             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
  16.         return  x.view().inject(this, inflater, container); 
  17.     }  
@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的注解:

  1. public class MyAdapter extends  BaseAdapter{ 
  2.     private Context context; 
  3.     private List<Person> list; 
  4.     private LayoutInflater mInflater; 
  5.     private ImageOptions options; 
  6.     public ViewHolder holder; 
  7.     public MyAdapter(Context context, List<Person> list) { 
  8.         this.context = context; 
  9.         this.list = list; 
  10.         this.mInflater=LayoutInflater.from(context); 
  11.         options=new ImageOptions.Builder().setLoadingDrawableId(R.drawable.ic_launcher) 
  12.                 .setLoadingDrawableId(R.drawable.ic_launcher).setUseMemCache(true).setCircular(true).build(); 
  13.     } 
  14.  
  15.     @Override 
  16.     public int getCount() { 
  17.         return list.size(); 
  18.     } 
  19.  
  20.     @Override 
  21.     public Object getItem(int position) { 
  22.         return list.get(position); 
  23.     } 
  24.  
  25.     @Override 
  26.     public long getItemId(int position) { 
  27.         return position; 
  28.     } 
  29.  
  30.     @Override 
  31.     public View getView(int position, View convertView, ViewGroup parent) { 
  32.         holder=null
  33.         if(convertView==null){ 
  34.             convertView=mInflater.inflate(R.layout.itemone, null); 
  35.             holder=new ViewHolder(); 
  36.             x.view().inject(holder,convertView); 
  37.             convertView.setTag(holder); 
  38.         } 
  39.         else
  40.             holder=(ViewHolder) convertView.getTag(); 
  41.         } 
  42.         Person bean=list.get(position); 
  43.         holder.tv_name.setText(bean.getName()); 
  44.         x.image().bind(holder.iv_image, bean.getImgUrl(), options); 
  45.         return convertView; 
  46.     } 
  47.  
  48.     class ViewHolder{ 
  49.         @ViewInject(R.id.tv_name) 
  50.         private TextView tv_name; 
  51.         @ViewInject(R.id.iv_image) 
  52.         private ImageView iv_image; 
  53.     } 
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的加载网络图片的方法。后面我会详细进行讲解。

网络模块

XUtils的网络请求方法和一些网络请求框架的用法非常类似,我进行了一些简单的封装。
封装一共有3个文件,分别是网络请求工具类XUtil,请求响应数据的解析类,还有一个就是一个请求成功的一个接口回调类。
代码如下:

  1. public class XUtil { 
  2.     /**
  3.      * 发送get请求
  4.      * @param <T>
  5.      */ 
  6.     public static <T> Cancelable Get(String url,Map<String,String> map,CommonCallback<T> callback){ 
  7.         RequestParams params=new RequestParams(url); 
  8.         if(null!=map){ 
  9.             for(Map.Entry<String, String> entry : map.entrySet()){ 
  10.                 params.addQueryStringParameter(entry.getKey(), entry.getValue()); 
  11.             } 
  12.         } 
  13.         Cancelable cancelable = x.http().get(params, callback); 
  14.         return cancelable; 
  15.     } 
  16.  
  17.     /**
  18.      * 发送post请求
  19.      * @param <T>
  20.      */ 
  21.     public static <T> Cancelable Post(String url,Map<String,Object> map,CommonCallback<T> callback){ 
  22.         RequestParams params=new RequestParams(url); 
  23.         if(null!=map){ 
  24.             for(Map.Entry<String, Object> entry : map.entrySet()){ 
  25.                 params.addParameter(entry.getKey(), entry.getValue()); 
  26.             } 
  27.         } 
  28.         Cancelable cancelable = x.http().post(params, callback); 
  29.         return cancelable; 
  30.     } 
  31.  
  32.  
  33.     /**
  34.      * 上传文件
  35.      * @param <T>
  36.      */ 
  37.     public static <T> Cancelable UpLoadFile(String url,Map<String,Object> map,CommonCallback<T> callback){ 
  38.         RequestParams params=new RequestParams(url); 
  39.         if(null!=map){ 
  40.             for(Map.Entry<String, Object> entry : map.entrySet()){ 
  41.                 params.addParameter(entry.getKey(), entry.getValue()); 
  42.             } 
  43.         } 
  44.         params.setMultipart(true); 
  45.         Cancelable cancelable = x.http().get(params, callback); 
  46.         return cancelable; 
  47.     } 
  48.  
  49.     /**
  50.      * 下载文件
  51.      * @param <T>
  52.      */ 
  53.     public static <T> Cancelable DownLoadFile(String url,String filepath,CommonCallback<T> callback){ 
  54.         RequestParams params=new RequestParams(url); 
  55.         //设置断点续传 
  56.         params.setAutoResume(true); 
  57.         params.setSaveFilePath(filepath); 
  58.         Cancelable cancelable = x.http().get(params, callback); 
  59.         return cancelable; 
  60.     } 
  61.  
  62.  
  63. public class JsonResponseParser implements ResponseParser { 
  64.     //检查服务器返回的响应头信息 
  65.     @Override 
  66.     public void checkResponse(UriRequest request) throws Throwable { 
  67.     } 
  68.  
  69.     /**
  70.      * 转换result为resultType类型的对象
  71.      *
  72.      * @param resultType  返回值类型(可能带有泛型信息)
  73.      * @param resultClass 返回值类型
  74.      * @param result      字符串数据
  75.      * @return
  76.      * @throws Throwable
  77.      */ 
  78.     @Override 
  79.     public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable { 
  80.         return new Gson().fromJson(result, resultClass); 
  81.     } 
  82.  
  83.  
  84. public class MyCallBack<ResultType> implements Callback.CommonCallback<ResultType>{ 
  85.  
  86.     @Override 
  87.     public void onSuccess(ResultType result) { 
  88.         //可以根据公司的需求进行统一的请求成功的逻辑处理 
  89.     } 
  90.  
  91.     @Override 
  92.     public void onError(Throwable ex, boolean isOnCallback) { 
  93.         //可以根据公司的需求进行统一的请求网络失败的逻辑处理 
  94.     } 
  95.  
  96.     @Override 
  97.     public void onCancelled(CancelledException cex) { 
  98.  
  99.     } 
  100.  
  101.     @Override 
  102.     public void onFinished() { 
  103.  
  104.     } 
  105.  
  106.  
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().get(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请求示例:

  1. //本get请求来自于免费测试接口:http://www.k780.com/api/entry.baidu 
  2. String url="http://api.k780.com:88/?app=idcard.get"
  3.         Map<String,String> map=new HashMap<>(); 
  4.         map.put("appkey", "10003"); 
  5.         map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4"); 
  6.         map.put("format", "json"); 
  7.         map.put("idcard", "110101199001011114"); 
  8.         XUtil.Get(url, map, new MyCallBack<PersonInfoBean>(){ 
  9.  
  10.             @Override 
  11.             public void onSuccess(PersonInfoBean result) { 
  12.                 super.onSuccess(result); 
  13.                 Log.e("result", result.toString()); 
  14.             } 
  15.  
  16.             @Override 
  17.             public void onError(Throwable ex, boolean isOnCallback) { 
  18.                 super.onError(ex, isOnCallback); 
  19.  
  20.  
  21.             } 
  22.  
  23.         }); 
//本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请求

  1. String url="http://api.k780.com:88/?app=idcard.get"
  2.         Map<String,Object> map=new HashMap<>(); 
  3.         map.put("appkey", "10003"); 
  4.         map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4"); 
  5.         map.put("format", "json"); 
  6.         map.put("idcard", "110101199001011114"); 
  7.         XUtil.Post(url, map, new MyCallBack<PersonInfoBean>(){ 
  8.  
  9.             @Override 
  10.             public void onSuccess(PersonInfoBean result) { 
  11.                 super.onSuccess(result); 
  12.                 Log.e("result", result.toString()); 
  13.             } 
  14.  
  15.             @Override 
  16.             public void onError(Throwable ex, boolean isOnCallback) { 
  17.                 super.onError(ex, isOnCallback); 
  18.  
  19.             } 
  20.         }); 
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.上传文件

  1. /**
  2.      * 上传文件(支持多文件上传)
  3.      */ 
  4.     private void uploadfile() { 
  5.         //图片上传地址 
  6.         String url=""
  7.         Map<String,Object> map=new HashMap<>(); 
  8.         //传入自己的相应参数 
  9.         //map.put(key, value); 
  10.         //map.put(key, value); 
  11.         XUtil.UpLoadFile(url, map, new MyCallBack<String>(){ 
  12.  
  13.             @Override 
  14.             public void onSuccess(String result) { 
  15.                 super.onSuccess(result); 
  16.             } 
  17.  
  18.             @Override 
  19.             public void onError(Throwable ex, boolean isOnCallback) { 
  20.                 super.onError(ex, isOnCallback); 
  21.             } 
  22.  
  23.         }); 
  24.  
  25.     } 
/**
     * 上传文件(支持多文件上传)
     */
    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.下载文件

  1. private void downloadfile() { 
  2.         //文件下载地址 
  3.         String url=""
  4.         //文件保存在本地的路径 
  5.         String filepath=""
  6.         XUtil.DownLoadFile(url, filepath,new MyCallBack<File>(){ 
  7.             @Override 
  8.             public void onSuccess(File result) { 
  9.                 super.onSuccess(result); 
  10.  
  11.             } 
  12.  
  13.             @Override 
  14.             public void onError(Throwable ex, boolean isOnCallback) { 
  15.                 super.onError(ex, isOnCallback); 
  16.  
  17.             } 
  18.         }); 
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.下载文件带进度条

  1. private void downloadprogressfile() { 
  2.         //文件下载地址 
  3.         String url=""
  4.         //文件保存在本地的路径 
  5.         String filepath=""
  6.         XUtil.DownLoadFile(url, filepath,new MyProgressCallBack<File>(){ 
  7.  
  8.             @Override 
  9.             public void onSuccess(File result) { 
  10.                 super.onSuccess(result); 
  11.  
  12.             } 
  13.  
  14.             @Override 
  15.             public void onError(Throwable ex, boolean isOnCallback) { 
  16.                 super.onError(ex, isOnCallback); 
  17.  
  18.             } 
  19.             @Override 
  20.             public void onLoading(long total, long current, 
  21.                     boolean isDownloading) { 
  22.                 super.onLoading(total, current, isDownloading); 
  23.  
  24.             } 
  25.         }); 
  26.     } 
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格式返回)

  1. private void getxml() { 
  2.         String url="http://flash.weather.com.cn/wmaps/xml/china.xml"
  3.         XUtil.Get(url, null, new MyCallBack<String>(){ 
  4.  
  5.             @Override 
  6.             public void onSuccess(String xmlString) { 
  7.                 super.onSuccess(xmlString); 
  8.                 try
  9.                     XmlPullParserFactory factory = XmlPullParserFactory.newInstance();   
  10.                     XmlPullParser xmlPullParser = factory.newPullParser();   
  11.                     xmlPullParser.setInput(new StringReader(xmlString));   
  12.                     int eventType = xmlPullParser.getEventType();   
  13.                     while (eventType != XmlPullParser.END_DOCUMENT) {   
  14.                         switch (eventType) {   
  15.                         case XmlPullParser.START_TAG:   
  16.                             String nodeName = xmlPullParser.getName();   
  17.                             if ("city".equals(nodeName)) {   
  18.                                 String pName = xmlPullParser.getAttributeValue(0);   
  19.                                 Log.e("TAG", "city is " + pName);   
  20.                             }   
  21.                             break;   
  22.                         }   
  23.                         eventType = xmlPullParser.next();   
  24.                     }   
  25.                 }catch(Exception e){ 
  26.                     e.printStackTrace(); 
  27.                 } 
  28.             } 
  29.  
  30.             @Override 
  31.             public void onError(Throwable ex, boolean isOnCallback) { 
  32.                 super.onError(ex, isOnCallback); 
  33.             } 
  34.  
  35.         }); 
  36.     } 
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);
            }

        });
    }


 

图片加载模块

用法:

  1. x.image().bind(imageView, url, imageOptions); 
  2. x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions); 
  3. x.image().bind(imageView, "assets://test.gif", imageOptions); 
  4. x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() {...}); 
  5. x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...}); 
  6. x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...}); 
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这个类吧:

  1. ImageOptions options=new ImageOptions.Builder() 
  2. //设置加载过程中的图片 
  3. .setLoadingDrawableId(R.drawable.ic_launcher) 
  4. //设置加载失败后的图片 
  5. .setFailureDrawableId(R.drawable.ic_launcher) 
  6. //设置使用缓存 
  7. .setUseMemCache(true
  8. //设置显示圆形图片 
  9. .setCircular(true
  10. //设置支持gif 
  11. .setIgnoreGif(false
  12. .build(); 
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中有涉及到,请自行参考。

源码下载地址:http://download.csdn.net/detail/a1002450926/9364413

 

上一篇文章,主要介绍了XUtil3的注解模块,网络模块,图片加载模块,今天给大家带来数据库模块的讲解,现在主流的ORM框架很多,比如OrmLite,GreenDao,Active Android,Realm等等,这些框架每个都有自己的优点和缺点,大家完全可以根据自己项目的实际需求进行选择,下面开始进入今天的数据库模块的介绍。

今天主要给大家带来以下几个模块: 如何创建删除一张表 如何对表进行增删查改操作 如何创建数据库和删除数据库 如何建立一表对一表,多表对一表,多表对多表的外键操作。 相信对ORM框架有过了解的人,大概都知道只要创建一个JavaBean对象,在类的上面和属性的上面添加注释标签,这样就能生成一个表。下面带大家看一下XUtils3的实体bean的写法: 

  1. @Table(name="person"
  2. public class PersonTable { 
  3.     @Column(name="id",isId=true,autoGen=true
  4.     private int id; 
  5.     //姓名 
  6.     @Column(name="name"
  7.     private String name; 
  8.  
  9.     //年龄 
  10.     @Column(name="age"
  11.     private int age; 
  12.  
  13.     //性别 
  14.     @Column(name="sex"
  15.     private String sex; 
  16.  
  17.     //工资 
  18.     @Column(name="salary"
  19.     private String salary; 
  20.  
  21.     public int getId() { 
  22.         return id; 
  23.     } 
  24.  
  25.     public void setId(int id) { 
  26.         this.id = id
  27.     } 
  28.  
  29.     public String getName() { 
  30.         return name; 
  31.     } 
  32.  
  33.     public void setName(String name) { 
  34.         this.name = name
  35.     } 
  36.  
  37.  
  38.     public String getSex() { 
  39.         return sex; 
  40.     } 
  41.  
  42.     public void setSex(String sex) { 
  43.         this.sex = sex
  44.     } 
  45.  
  46.     public int getAge() { 
  47.         return age; 
  48.     } 
  49.  
  50.     public void setAge(int age) { 
  51.         this.age = age
  52.     } 
  53.  
  54.  
  55.     public String getSalary() { 
  56.         return salary; 
  57.     } 
  58.  
  59.     public void setSalary(String salary) { 
  60.         this.salary = salary
  61.     } 
  62.  
  63.     @Override 
  64.     public String toString() { 
  65.         return "PersonTable [id=" + id + ", name=" + name + ", age=" + age 
  66.                 + ", sex=" + sex + ", salary=" + salary + "]"; 
  67.     } 
@Table(name="person")
public class PersonTable {
    @Column(name="id",isId=true,autoGen=true)
    private int id;
    //姓名
    @Column(name="name")
    private String name;

    //年龄
    @Column(name="age")
    private int age;

    //性别
    @Column(name="sex")
    private String sex;

    //工资
    @Column(name="salary")
    private String salary;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    public String getSalary() {
        return salary;
    }

    public void setSalary(String salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "PersonTable [id=" + id + ", name=" + name + ", age=" + age
                + ", sex=" + sex + ", salary=" + salary + "]";
    }
}


通过上方的实体bean,我们需要知道一个表对应的实体bean需要注意以下几点:
1.在类名上面加入@Table标签,标签里面的属性name的值就是以后生成的数据库的表的名字
2.实体bean里面的属性需要加上@Column标签,这样这个标签的name属性的值会对应数据库里面的表的字段。
3.实体bean里面的普通属性,如果没有加上@Column标签就不会在生成表的时候在表里面加入字段。
4.实体bean中必须有一个主键,如果没有主键,表以后不会创建成功,@Column(name=”id”,isId=true,autoGen=true)这个属性name的值代表的是表的主键的标识,isId这个属性代表的是该属性是不是表的主键,autoGen代表的是主键是否是自增长,如果不写autoGen这个属性,默认是自增长的属性。

既然知道怎么写实体bean了,下面看看如何在程序中创建一个数据库和如何生成表的吧。

  1. public class XUtil { 
  2.     static DbManager.DaoConfig daoConfig; 
  3.     public static DaoConfig getDaoConfig(){ 
  4.         File file=new File(Environment.getExternalStorageDirectory().getPath()); 
  5.         if(daoConfig==null){ 
  6.             daoConfig=new DbManager.DaoConfig() 
  7.             .setDbName("shiyan.db"
  8.             .setDbDir(file) 
  9.             .setDbVersion(1
  10.             .setAllowTransaction(true
  11.             .setDbUpgradeListener(new DbUpgradeListener() { 
  12.                 @Override 
  13.                 public void onUpgrade(DbManager db, int oldVersion, int newVersion) { 
  14.  
  15.                 } 
  16.             }); 
  17.         } 
  18.         return daoConfig; 
  19.     } 
public class XUtil {
    static DbManager.DaoConfig daoConfig;
    public static DaoConfig getDaoConfig(){
        File file=new File(Environment.getExternalStorageDirectory().getPath());
        if(daoConfig==null){
            daoConfig=new DbManager.DaoConfig()
            .setDbName("shiyan.db")
            .setDbDir(file)
            .setDbVersion(1)
            .setAllowTransaction(true)
            .setDbUpgradeListener(new DbUpgradeListener() {
                @Override
                public void onUpgrade(DbManager db, int oldVersion, int newVersion) {

                }
            });
        }
        return daoConfig;
    }
}


通过XUti.getDaoConfig()方法,我们能够获取到一个DaoConfig对象。通过getDaoConfig()方法,我们可以知道这个方法主要可以做以下事情:
1.setDbName 设置数据库的名称
2.setDbDir 设置数据库存放的路径
3.setDbVersion 设置数据库的版本
4.setAllowTransaction(true) 设置允许开启事务
5.setDbUpgradeListener 设置一个版本升级的监听方法
那么具体我们什么时候创建的表呢?如果我们单纯的调用XUti.getDaoConfig()方法是不能够创建PersonTable这个实体对应的person这张表的,那么如何创建表呢?
只需要一下几步:
1.DaoConfig daoConfig=XUtil.getDaoConfig();
2.DbManager db = x.getDb(daoConfig);
这里我要告诉大家的是,数据库里面表的创建的时间,只有在你对数据库里面的操作涉及到这张表的操作时,会先判断当前的表是否存在,如果不存在,才会创建一张表,如果存在,才会进行相应的CRUD操作,但是只要我们想进行一张表的CRUD操作,我们必须先执行上面的2步,通俗点说就是必须拿到一个Dbmanger这个对象,我为什么这么说呢?那么咱们就先看一下DbManger的庐山真面目吧。
DbManager部分源码如下:

  1. public interface DbManager extends Closeable { 
  2.  
  3.     DaoConfig getDaoConfig(); 
  4.  
  5.     SQLiteDatabase getDatabase(); 
  6.  
  7.     /**
  8.      * 保存实体类或实体类的List到数据库,
  9.      * 如果该类型的id是自动生成的, 则保存完后会给id赋值.
  10.      *
  11.      * @param entity
  12.      * @return
  13.      * @throws DbException
  14.      */ 
  15.     boolean saveBindingId(Object entity) throws DbException; 
  16.  
  17.     /**
  18.      * 保存或更新实体类或实体类的List到数据库, 根据id对应的数据是否存在.
  19.      *
  20.      * @param entity
  21.      * @throws DbException
  22.      */ 
  23.     void saveOrUpdate(Object entity) throws DbException; 
  24.  
  25.     /**
  26.      * 保存实体类或实体类的List到数据库
  27.      *
  28.      * @param entity
  29.      * @throws DbException
  30.      */ 
  31.     void save(Object entity) throws DbException; 
  32.  
  33.     /**
  34.      * 保存或更新实体类或实体类的List到数据库, 根据id和其他唯一索引判断数据是否存在.
  35.      *
  36.      * @param entity
  37.      * @throws DbException
  38.      */ 
  39.     void replace(Object entity) throws DbException; 
  40.  
  41.     / delete 
  42.     void deleteById(Class<?> entityType, Object idValue) throws DbException; 
  43.  
  44.     void delete(Object entity) throws DbException; 
  45.  
  46.     void delete(Class<?> entityType) throws DbException; 
  47.  
  48.     void delete(Class<?> entityType, WhereBuilder whereBuilder) throws DbException; 
  49.  
  50.     / update 
  51.     void update(Object entity, String... updateColumnNames) throws DbException; 
  52.  
  53.     void update(Object entity, WhereBuilder whereBuilder, String... updateColumnNames) throws DbException; 
  54.  
  55.     / find 
  56.     <T> T findById(Class<T> entityType, Object idValue) throws DbException; 
  57.  
  58.     <T> T findFirst(Class<T> entityType) throws DbException; 
  59.  
  60.     <T> List<T> findAll(Class<T> entityType) throws DbException; 
  61.  
  62.     <T> Selector<T> selector(Class<T> entityType) throws DbException; 
  63.  
  64.     DbModel findDbModelFirst(SqlInfo sqlInfo) throws DbException; 
  65.  
  66.     List<DbModel> findDbModelAll(SqlInfo sqlInfo) throws DbException; 
  67.  
  68.     / table 
  69.  
  70.     /**
  71.      * 删除表
  72.      *
  73.      * @param entityType
  74.      * @throws DbException
  75.      */ 
  76.     void dropTable(Class<?> entityType) throws DbException; 
  77.  
  78.     /**
  79.      * 添加一列,
  80.      * 新的entityType中必须定义了这个列的属性.
  81.      *
  82.      * @param entityType
  83.      * @param column
  84.      * @throws DbException
  85.      */ 
  86.     void addColumn(Class<?> entityType, String column) throws DbException; 
  87.  
  88.     / db 
  89.  
  90.     /**
  91.      * 删除库
  92.      *
  93.      * @throws DbException
  94.      */ 
  95.     void dropDb() throws DbException; 
  96.  
  97.     /**
  98.      * 关闭数据库,
  99.      * xUtils对同一个库的链接是单实例的, 一般不需要关闭它.
  100.      *
  101.      * @throws IOException
  102.      */ 
  103.     void close() throws IOException; 
  104.  
  105.     / custom 
  106.     void execNonQuery(SqlInfo sqlInfo) throws DbException; 
  107.  
  108.     void execNonQuery(String sql) throws DbException; 
  109.  
  110.     Cursor execQuery(SqlInfo sqlInfo) throws DbException; 
  111.  
  112.     Cursor execQuery(String sql) throws DbException; 
public interface DbManager extends Closeable {

    DaoConfig getDaoConfig();

    SQLiteDatabase getDatabase();

    /**
     * 保存实体类或实体类的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;

    / delete
    void deleteById(Class<?> entityType, Object idValue) throws DbException;

    void delete(Object entity) throws DbException;

    void delete(Class<?> entityType) throws DbException;

    void delete(Class<?> entityType, WhereBuilder whereBuilder) throws DbException;

    / update
    void update(Object entity, String... updateColumnNames) throws DbException;

    void update(Object entity, WhereBuilder whereBuilder, String... updateColumnNames) throws DbException;

    / find
    <T> T findById(Class<T> entityType, Object idValue) throws DbException;

    <T> T findFirst(Class<T> entityType) throws DbException;

    <T> List<T> findAll(Class<T> entityType) throws DbException;

    <T> Selector<T> selector(Class<T> entityType) throws DbException;

    DbModel findDbModelFirst(SqlInfo sqlInfo) throws DbException;

    List<DbModel> findDbModelAll(SqlInfo sqlInfo) throws DbException;

    / table

    /**
     * 删除表
     *
     * @param entityType
     * @throws DbException
     */
    void dropTable(Class<?> entityType) throws DbException;

    /**
     * 添加一列,
     * 新的entityType中必须定义了这个列的属性.
     *
     * @param entityType
     * @param column
     * @throws DbException
     */
    void addColumn(Class<?> entityType, String column) throws DbException;

    / db

    /**
     * 删除库
     *
     * @throws DbException
     */
    void dropDb() throws DbException;

    /**
     * 关闭数据库,
     * xUtils对同一个库的链接是单实例的, 一般不需要关闭它.
     *
     * @throws IOException
     */
    void close() throws IOException;

    / custom
    void execNonQuery(SqlInfo sqlInfo) throws DbException;

    void execNonQuery(String sql) throws DbException;

    Cursor execQuery(SqlInfo sqlInfo) throws DbException;

    Cursor execQuery(String sql) throws DbException;
}


通过DbManager这个类我们知道主要它做了以下几件事情:
1.getDaoConfig 获取数据库的配置信息
2.getDatabase 获取数据库实例
3.saveBindingId saveOrUpdate save 插入数据的3个方法(保存数据)
4.replace 只有存在唯一索引时才有用 慎重
5.delete操作的4种方法(删除数据)
6.update操作的2种方法(修改数据)
7.find操作6种方法(查询数据)
8.dropTable 删除表
9.addColumn 添加一列
10.dropDb 删除数据库

插入操作

  1. <span style="font-size:18px;">private void insert() { 
  2.         try
  3.             PersonTable person=new PersonTable(); 
  4.             person.setName("小丽"); 
  5.             person.setAge(19); 
  6.             person.setSex("woman"); 
  7.             person.setSalary(4000); 
  8.             db.save(person); 
  9.           //db.saveOrUpdate(person); 
  10.           //db.saveBindingId(person); 
  11.         } catch (DbException e) { 
  12.             e.printStackTrace(); 
  13.         } 
  14.     }</span> 
<span style="font-size:18px;">private void insert() {
        try {
            PersonTable person=new PersonTable();
            person.setName("小丽");
            person.setAge(19);
            person.setSex("woman");
            person.setSalary(4000);
            db.save(person);
          //db.saveOrUpdate(person);
          //db.saveBindingId(person);
        } catch (DbException e) {
            e.printStackTrace();
        }
    }</span>
结果如下:

3种插入操作所需要的参数都是一个实体bean。save和saveOrUpdate的区别就是当一个实体里面的主键一样时如果使用saveOrUpdate会将当前主键对应的这条数据进行替换,而如果你使用了save就会报错。
saveBindingId主要是存进去的数据如果当前表有主键回合主键进行绑定关联。
当你执行完这个方法后,你会看到数据库里面person表里面多了一条数据.


查询操作

当前数据库中的表的效果如下:

1.findById的使用
该方法主要是通过主键的值来进行查找表里面的数据
需求:查找上方person表里面id为3的数据

  1. private void query(){ 
  2.         try
  3.             PersonTable person = db.findById(PersonTable.class, "2"); 
  4.             Log.e("person",person.toString()); 
  5.         } catch (DbException e) { 
  6.             e.printStackTrace(); 
  7.         } 
  8.     } 
private void query(){
        try {
            PersonTable person = db.findById(PersonTable.class, "2");
            Log.e("person",person.toString());
        } catch (DbException e) {
            e.printStackTrace();
        }
    }

结果如下:

2.findFirst的使用
该方法主要是返回当前表里面的第一条数据
需求:查找上方person表里面的第一条数据

  1. private void query() { 
  2.         try
  3.             PersonTable person = db.findFirst(PersonTable.class); 
  4.             Log.e("person", person.toString()); 
  5.         } catch (DbException e) { 
  6.             e.printStackTrace(); 
  7.         } 
  8.     } 
private void query() {
        try {
            PersonTable person = db.findFirst(PersonTable.class);
            Log.e("person", person.toString());
        } catch (DbException e) {
            e.printStackTrace();
        }
    }


3.findAll的使用
该方法主要是返回当前表里面的所有数据
需求:查找person表里面的所有数据

  1. private void query() { 
  2.         try
  3.             List<PersonTable> persons = db.findAll(PersonTable.class); 
  4.             Log.e("persons", persons.toString()); 
  5.         } catch (DbException e) { 
  6.             e.printStackTrace(); 
  7.         } 
  8.     } 
private void query() {
        try {
            List<PersonTable> persons = db.findAll(PersonTable.class);
            Log.e("persons", persons.toString());
        } catch (DbException e) {
            e.printStackTrace();
        }
    }



4.selector的使用
该方法主要是用来进行一些特定条件的查找
需求:查找person表里面age大于30并且性别为man的数据

  1. private void query() { 
  2.         try
  3.             List<PersonTable> persons = db.selector(PersonTable.class).where("age", ">", 30).and("sex", "=", "man").findAll(); 
  4.             for(PersonTable person:persons){ 
  5.                 Log.e("person",person.toString()); 
  6.             } 
  7.         } catch (DbException e) { 
  8.             e.printStackTrace(); 
  9.         } 
  10.     } 
private void query() {
        try {
            List<PersonTable> persons = db.selector(PersonTable.class).where("age", ">", 30).and("sex", "=", "man").findAll();
            for(PersonTable person:persons){
                Log.e("person",person.toString());
            }
        } catch (DbException e) {
            e.printStackTrace();
        }
    }



5.findDbModelFirst的使用
说起这个方法,该方法返回一个DbModel对象,那么该对象是什么呢?
DbModel源码如下:

  1. public final class DbModel { 
  2.  
  3.     /**
  4.      * key: columnName
  5.      * value: valueStr
  6.      */ 
  7.     private HashMap<String, String> dataMap = new HashMap<String, String>(); 
  8.  
  9.     public String getString(String columnName) { 
  10.         return dataMap.get(columnName); 
  11.     } 
  12.  
  13.     public int getInt(String columnName) { 
  14.         return Integer.valueOf(dataMap.get(columnName)); 
  15.     } 
  16.  
  17.     public boolean getBoolean(String columnName) { 
  18.         String value = dataMap.get(columnName); 
  19.         if (value != null) { 
  20.             return value.length() == 1 ? "1".equals(value) : Boolean.valueOf(value); 
  21.         } 
  22.         return false
  23.     } 
  24.  
  25.     public double getDouble(String columnName) { 
  26.         return Double.valueOf(dataMap.get(columnName)); 
  27.     } 
  28.  
  29.     public float getFloat(String columnName) { 
  30.         return Float.valueOf(dataMap.get(columnName)); 
  31.     } 
  32.  
  33.     public long getLong(String columnName) { 
  34.         return Long.valueOf(dataMap.get(columnName)); 
  35.     } 
  36.  
  37.     public Date getDate(String columnName) { 
  38.         long date = Long.valueOf(dataMap.get(columnName)); 
  39.         return new Date(date); 
  40.     } 
  41.  
  42.     public java.sql.Date getSqlDate(String columnName) { 
  43.         long date = Long.valueOf(dataMap.get(columnName)); 
  44.         return new java.sql.Date(date); 
  45.     } 
  46.  
  47.     public void add(String columnName, String valueStr) { 
  48.         dataMap.put(columnName, valueStr); 
  49.     } 
  50.  
  51.     /**
  52.      * @return key: columnName
  53.      */ 
  54.     public HashMap<String, String> getDataMap() { 
  55.         return dataMap; 
  56.     } 
  57.  
  58.     /**
  59.      * @param columnName
  60.      * @return
  61.      */ 
  62.     public boolean isEmpty(String columnName) { 
  63.         return TextUtils.isEmpty(dataMap.get(columnName)); 
  64.     } 
public final class DbModel {

    /**
     * key: columnName
     * value: valueStr
     */
    private HashMap<String, String> dataMap = new HashMap<String, String>();

    public String getString(String columnName) {
        return dataMap.get(columnName);
    }

    public int getInt(String columnName) {
        return Integer.valueOf(dataMap.get(columnName));
    }

    public boolean getBoolean(String columnName) {
        String value = dataMap.get(columnName);
        if (value != null) {
            return value.length() == 1 ? "1".equals(value) : Boolean.valueOf(value);
        }
        return false;
    }

    public double getDouble(String columnName) {
        return Double.valueOf(dataMap.get(columnName));
    }

    public float getFloat(String columnName) {
        return Float.valueOf(dataMap.get(columnName));
    }

    public long getLong(String columnName) {
        return Long.valueOf(dataMap.get(columnName));
    }

    public Date getDate(String columnName) {
        long date = Long.valueOf(dataMap.get(columnName));
        return new Date(date);
    }

    public java.sql.Date getSqlDate(String columnName) {
        long date = Long.valueOf(dataMap.get(columnName));
        return new java.sql.Date(date);
    }

    public void add(String columnName, String valueStr) {
        dataMap.put(columnName, valueStr);
    }

    /**
     * @return key: columnName
     */
    public HashMap<String, String> getDataMap() {
        return dataMap;
    }

    /**
     * @param columnName
     * @return
     */
    public boolean isEmpty(String columnName) {
        return TextUtils.isEmpty(dataMap.get(columnName));
    }
}



 

通过源码,我们分析发现DbModel本质就是一个key为当前表的字段,value为当前某条记录的值的一个HashMap.
需求:查找person表中第一条数据的那个人的年龄age是多少。

  1. private void query() { 
  2.         try
  3.             DbModel model = db.findDbModelFirst(new SqlInfo("select * from person")); 
  4.             Log.e("age", model.getString("age")); 
  5.         } catch (DbException e) { 
  6.             e.printStackTrace();  
  7.         } 
  8.     } 
private void query() {
        try {
            DbModel model = db.findDbModelFirst(new SqlInfo("select * from person"));
            Log.e("age", model.getString("age"));
        } catch (DbException e) {
            e.printStackTrace(); 
        }
    }


注意上面的sqlInfo对象的创建的构造参数只需要传入一个sql语句即可。


6.findDbModelAll的用法
该方法的用途就是返回满足sqlInfo信息的所有数据的字段的一个集合。
需求:查找person表中年龄age大于25里面的所有人的姓名

  1. private void query() { 
  2.         try
  3.             List<DbModel> persons = db.findDbModelAll(new SqlInfo("select * from person where age > 25")); 
  4.             for(DbModel person:persons){ 
  5.                 Log.e("name", person.getString("name")); 
  6.             } 
  7.         } catch (DbException e) { 
  8.             e.printStackTrace(); 
  9.         } 
  10.     } 
private void query() {
        try {
            List<DbModel> persons = db.findDbModelAll(new SqlInfo("select * from person where age > 25"));
            for(DbModel person:persons){
                Log.e("name", person.getString("name"));
            }
        } catch (DbException e) {
            e.printStackTrace();
        }
    }


基本把查询的6种方式都说了一遍,当然上面的6种需求不一定完全用上面的查询方法可以查出结果,我这么查询的目的主要是带领大家熟悉一下XUtils3的6种查询方法是如何使用的,会了上面的6种方法,我相信你的查询不会有太大问题,至于复杂的查询无非就是sql语句的基本功力了,大家赶紧动手操练一下吧。


修改操作

当前数据库中的表的效果如下:

修改一共有2种方法:
第一种:
需求:我们把上面的id为1的这条记录的age修改为25岁

  1. private void update() { 
  2.         try
  3.             PersonTable person = db.findById(PersonTable.class, 1); 
  4.             person.setAge(25); 
  5.             db.update(person, "age"); 
  6.         }catch(Exception e){ 
  7.             e.printStackTrace(); 
  8.         } 
  9.     } 
private void update() {
        try{
            PersonTable person = db.findById(PersonTable.class, 1);
            person.setAge(25);
            db.update(person, "age");
        }catch(Exception e){
            e.printStackTrace();
        }
    }


通过方法,我们知道首先要通过DBManager通过查找的方法先找到id为1的这个实体bean,如果你对里面的哪个字段需要修改,只需要重新set这个属性的值,然后调用DBManager.update方法,第一个参数是需要修改的实体,第二个参数是对应的属性。

第二种:
需求:将person表中性别为man的工资salary都变成6000。

  1. private void update() { 
  2.         try
  3.             List<PersonTable> persons = db.findAll(PersonTable.class); 
  4.             for(PersonTable person:persons){ 
  5.                 person.setSalary(6000); 
  6.                 db.update(person, WhereBuilder.b("sex", "=", "man"), "salary"); 
  7.             } 
  8.         } catch (Exception e) { 
  9.             e.printStackTrace(); 
  10.         } 
  11.     } 
private void update() {
        try {
            List<PersonTable> persons = db.findAll(PersonTable.class);
            for(PersonTable person:persons){
                person.setSalary(6000);
                db.update(person, WhereBuilder.b("sex", "=", "man"), "salary");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


 

修改数据一共就2种方法,基本都是需要一个实体bean对象去进行操作的,上面的第二种方法无非就是在修改数据时,多了一个限制条件,这样修改数据显得灵活一些。
上面第二种update的方法的参数简单介绍一下:
第一个参数:实体bean对象
第二个参数:一个WhereBuilder对象,主要是通过静态b方法去构造一个where条件语句
第三个参数:需要修改的字段名,如果你的需求是修改了2个或者更多个字段,只需要在后面加上相应的参数即可,例如第二种方法我不止修改salary还需要修改age统一为40岁,参考如下;

  1. private void update() { 
  2.         try
  3.             List<PersonTable> persons = db.findAll(PersonTable.class); 
  4.             for(PersonTable person:persons){ 
  5.                 person.setSalary(6000); 
  6.                 person.setAge(40); 
  7.                 db.update(person, WhereBuilder.b("sex", "=", "man"), "salary","age"); 
  8.             } 
  9.         } catch (Exception e) { 
  10.             e.printStackTrace(); 
  11.         } 
  12.     } 
private void update() {
        try {
            List<PersonTable> persons = db.findAll(PersonTable.class);
            for(PersonTable person:persons){
                person.setSalary(6000);
                person.setAge(40);
                db.update(person, WhereBuilder.b("sex", "=", "man"), "salary","age");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


删除操作

当前数据库中的person表的效果如下:

1.deleteById的用法
该方法主要是根据表的主键进行单条记录的删除
需求:删除上方person表中id为5的记录

  1. private void delete() { 
  2.         try
  3.             db.deleteById(PersonTable.class, 5); 
  4.         } catch (DbException e) { 
  5.             e.printStackTrace(); 
  6.         } 
  7.     } 
private void delete() {
        try {
            db.deleteById(PersonTable.class, 5);
        } catch (DbException e) {
            e.printStackTrace();
        }
    }


 

结果如下:

2.delete(Object entity)的用法
该方法主要是根据实体bean进行对表里面的一条或多条数据进行删除
需求:删除name为骆驼这条信息的记录

  1. private void delete() { 
  2.         try
  3.             PersonTable person = db.selector(PersonTable.class).where("name", "=", "骆驼").findFirst(); 
  4.             db.delete(person); 
  5.         } catch (DbException e) { 
  6.             e.printStackTrace();  
  7.         } 
  8.     } 
private void delete() {
        try {
            PersonTable person = db.selector(PersonTable.class).where("name", "=", "骆驼").findFirst();
            db.delete(person);
        } catch (DbException e) {
            e.printStackTrace(); 
        }
    }



3.delete(Class<?> entityType)
该方法主要是用来删除表格里面的所有数据,但是注意:表还会存在,只是表里面数据没有了

  1. private void delete() { 
  2.         try { 
  3.             db.delete(PersonTable.class); 
  4.         } catch (DbException e) { 
  5.             e.printStackTrace();  
  6.         } 
  7.     } 
private void delete() {
        try {
            db.delete(PersonTable.class);
        } catch (DbException e) {
            e.printStackTrace(); 
        }
    }


 

4.delete(Class<?> entityType, WhereBuilder whereBuilder)
该方法主要是根据where语句的条件进行删除操作
需求:将person表总sex为woman并且salary为5000的信息删除

  1. private void delete() { 
  2.         try { 
  3.             db.delete(PersonTable.class, WhereBuilder.b("sex", "=", "woman").and("salary", "=", "5000")); 
  4.         } catch (DbException e) { 
  5.             e.printStackTrace(); 
  6.         } 
  7.     } 
private void delete() {
        try {
            db.delete(PersonTable.class, WhereBuilder.b("sex", "=", "woman").and("salary", "=", "5000"));
        } catch (DbException e) {
            e.printStackTrace();
        }
    }


5.dropTable(Class<?> entityType)

该方法是用来删除表

  1. private void delete() { 
  2.         try { 
  3.             db.dropTable(PersonTable.class); 
  4.         } catch (DbException e) { 
  5.             e.printStackTrace(); 
  6.         } 
  7.     } 
private void delete() {
        try {
            db.dropTable(PersonTable.class);
        } catch (DbException e) {
            e.printStackTrace();
        }
    }


6.dropDb()
该方法是用来删除数据库

  1. db.dropDb(); 
db.dropDb();


 

其他方法

1.addColumn(Class<> entityType, String column)
需求:在上方表中加入一个country字段
PersonTable的实体代码如下:

  1. @Table(name="person"
  2. public class PersonTable { 
  3.     @Column(name="id",isId=true,autoGen=true
  4.     private int id; 
  5.     //姓名 
  6.     @Column(name="name"
  7.     private String name; 
  8.  
  9.     //年龄 
  10.     @Column(name="age"
  11.     private int age; 
  12.  
  13.     //性别 
  14.     @Column(name="sex"
  15.     private String sex; 
  16.  
  17.     //工资 
  18.     @Column(name="salary"
  19.     private int salary; 
  20.  
  21.     //国家 
  22.     @Column(name="country",property="中国"
  23.     private String country; 
  24.  
  25.     public int getId() { 
  26.         return id; 
  27.     } 
  28.  
  29.     public void setId(int id) { 
  30.         this.id = id
  31.     } 
  32.  
  33.     public String getName() { 
  34.         return name; 
  35.     } 
  36.  
  37.     public void setName(String name) { 
  38.         this.name = name
  39.     } 
  40.  
  41.  
  42.     public String getSex() { 
  43.         return sex; 
  44.     } 
  45.  
  46.     public void setSex(String sex) { 
  47.         this.sex = sex
  48.     } 
  49.  
  50.     public int getAge() { 
  51.         return age; 
  52.     } 
  53.  
  54.     public void setAge(int age) { 
  55.         this.age = age
  56.     } 
  57.  
  58.  
  59.     public int getSalary() { 
  60.         return salary; 
  61.     } 
  62.  
  63.     public void setSalary(int salary) { 
  64.         this.salary = salary
  65.     } 
  66.  
  67.     public String getCountry() { 
  68.         return country; 
  69.     } 
  70.  
  71.     public void setCountry(String country) { 
  72.         this.country = country
  73.     } 
  74.  
  75.     @Override 
  76.     public String toString() { 
  77.         return "PersonTable [id=" + id + ", name=" + name + ", age=" + age 
  78.                 + ", sex=" + sex + ", salary=" + salary + ", country=" 
  79.                 + country + "]"; 
  80.     } 
@Table(name="person")
public class PersonTable {
    @Column(name="id",isId=true,autoGen=true)
    private int id;
    //姓名
    @Column(name="name")
    private String name;

    //年龄
    @Column(name="age")
    private int age;

    //性别
    @Column(name="sex")
    private String sex;

    //工资
    @Column(name="salary")
    private int salary;

    //国家
    @Column(name="country",property="中国")
    private String country;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "PersonTable [id=" + id + ", name=" + name + ", age=" + age
                + ", sex=" + sex + ", salary=" + salary + ", country="
                + country + "]";
    }
}


 


  1. private void addColumn() { 
  2.         try { 
  3.             db.addColumn(PersonTable.class, "country"); 
  4.         } catch (DbException e) { 
  5.             e.printStackTrace(); 
  6.         } 
  7.     } 
private void addColumn() {
        try {
            db.addColumn(PersonTable.class, "country");
        } catch (DbException e) {
            e.printStackTrace();
        }
    }


 

执行完addColumn方法,我们看到person表里面多了一个country字段.
结果如下:

总结

上面主要介绍了XUtils3的数据库模块,包括如何创建数据库,如何创建表,如何给表进行添加一列,如何对表进行增删查改的操作。说了这么多,相信大家肯定对XUtils3的数据库模块有了一个基本的理解,至于一表对一表,多表对一表,多表对多表等等这类需求,无非就是在某个表里面加入一个字段,或者创建一个第三方表用来维护表与表之间的关系,这种类型的例子我就不举例说明了,原因是那些需求都离不开上面的增删查改的方法,我相信你只要把上面的方法完全会用,你的XUtils3的数据库模块的基本使用就不会有问题了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值