Xutils3框架使用

目前Android开发很火的一个框架Xutils框架。它有四个模块:1、ViewUtils。2、HttpUtils。3、DbUtils。4、BitmapUtils

记得是去年的差不多这个时候,我的大学老师张老师介绍我去学习Xutils框架,当时项目有很多对数据库的操作,所以刚学习Xutils的时候,首先着重学习对DbUtils模块的使用,感受到了他的好用处。接下来为大家介绍一下Xutils框架的基本使用。

使用Xutils框架需要下载Xutils的jar包。(网上很好找,我使用的是xutils-3.3.25)

需要加入以下两个权限:

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

在Application中初始化Xutils框架 

  x.Ext.init(this); // 初始化Xutils框架
  x.isDebug(); //开启Debug模式,对app性能有一些影响

(一)、DbUtils模块

  Xutils框架使用了注解的方式来方便了对数据的操作,如下:

  @Table(name = "t_person")
  public class Person {

  @Column(name = "id", isId = true, autoGen = true, property = "unique")
   public int id;

  @Column(name="username")
  public String username;

  @Column(name="password")
  public String password;
  }
      注意:id属性的注解设置为isId=true,就不用设置autoGen=true和property = "unique",这里只是演示有这么一个属性。设置autoGen=true可以让此字段自增    ,pr  operty="unique"可以让该字段唯一,当然也可以设置一些其他的限制。
    接下来是对数据库的操作:
  1)、首先获取DaoConfig实例   
   private static DbManager.DaoConfig getDaoconfig(Context context) {
    DbManager.DaoConfig daoConfig = new DbManager.DaoConfig(); //获取DaoConfig
    daoConfig.setDbName("mydb.db"); //设置数据库名称
    daoConfig.setDbVersion(1); //设置版本号
    daoConfig.setDbDir(context.getDir("DATABASE", 0)); // 数据库位置为:data/data/包名/app_DATABASE
    daoConfig.setDbOpenListener(new DbManager.DbOpenListener() {
    @Override
    public void onDbOpened(DbManager db) {
    // 开启WAL, 对写入加速提升巨大
    db.getDatabase().enableWriteAheadLogging();
    }
    });
    return daoConfig;
    }
  2)、增删改查的操作
    //获取DbManager
    DbManager manager = x.getDb(getDaoconfig(context)); //获得DbManager
    Person person = new Person();
    person.name = "张三";
    person.password = "123456";
    //保存数据,调用manager的save方法直接保存对象到数据库(是不是感觉和Hibernate很像)
    manager.save(person);
    //保存或者更新数据,如果id在数据库中存在,则更新对象,不存在则添加为新的数据
    manager.saveOrUpdate(person);
    //删除数据,会删除数据库中与person的id相同的数据
    manager.delete(person);
    //查询数据,Xutils提供了几种查询方式,但是原理都是一样的,方便了开发人员的使用
      
      List<Pseron> ps = manager.selector(Person.class).where("username", "=", "张三").and("password", "=", "12346").findAll()      使用wher的参数为("列名", "运算符", "值")。运算符可以是“=”、“!=”、“<”、“<=”等等,并且可以根据实际情况添加add、or等条件。
      使用findAll返回的是所有符合条件的数据的List集合,泛型为当前查询的实体类。findFirst只得到查询的第一条数据。总之findAll的查询结果是一个List集合,而
        findFirst的查询结果是一个对象,这个也很好理解。

      如果只想查询某个列或者某几个列,可以使用以下的方法:
        DbModel model = manager.selector(Person.class).select("username","password").findFirst();
      返回的是一个DbModel类型,它将查询到的数据已Key-Value的形式保存,如果需要得到某一列的数据,只需要model.getString("列名")、model.getInt("列名")        等就可以得到数据。
      当然,如果自己想写SQL语句来做一些比较复杂的查询,Xutils也为我们提供了一些方法。
        Cursor c = manager.execQuery("sqlInfo");
        manager的execQuery方法可以的参数为我们根据实际要求编写的Sql代码,返回的是一个游标,这样就可以进行操作了。
      另外一种方法是通过manager的findDbModelAll和findDbModelFirst方法。
        DbModel model = manager.findDbModelFirst(new SqlInfo("select * from t_person where username='张三' and password='123456'")        );
        findDbModelAll也是同样的写法,返回的是一个List<DbModel>。

(二)、ViewUtils模块
    Xuitil的ViewUtils模块减少了我们大量的findViewById的操作,并且对一些常用的控件添加各种事件也进行了封装。
  1)、Activity中:
    首先为自定义的Activity添加ContentView注解
    @ContentView(R.layout.activity_main)
    public class MainActivity extends AppCompatActivity{
      
        @ViewInject(R.id.name_show)
        private TextView tvName;
       
        protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          x.view().inject(this);
        }
    }
    使用ContentView注解设置了当前Activity的ContentView,为定义的组件如TextView添加ViewInject注解就相当于做了findViewById的操作。
    注意:添加了注解之后要想让注解生效,必须要在onCreate方法中添加x.view().inject(this),用来注入当前的Activity。
    当我们需要为控件添加监听函数的时候,可以自己定义一个用来监听的方法,并且这个方法需要是private的。
    
    @Event(value = {R.id.login_btn, R.id.name_show}, type = View.OnClickListener.class)
    private void clickEvent(View view){
    }
    使用Event注解标志当前方法是用来监听控件的各种事件,value的值为int数组,内容为控件的Id,用来指定为那些控件添加当前事件的监听,type表示监听事件的类型,他的    值为class,默认为View.OnClickListener.class,使用默认值的时候,可以不用指定。我们可以根据自己的需要改变监听类。如需要监听ListView的item项的点击事件    ,则需要这样写:
    @Event(value = {R.id.post_list}, type = AdapterView.OnItemClickListener.class)
    private void itemClick(AdapterView<?> adapterView, View view, int position, long id{
    }
    大家应该看明白了,我们自定义的监听方法的参数需要和系统的监听方法的参数相同,这样我们也就可以通过他们做一些相应的操作。
  2)、Fragment中:
    ContentView注解的添加方法Activity是一样的,不同的地方是在Fragment的onCreateView方法这样写:
    public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState){
      return x.view().inject(this, inflater, viewGroup);
    }
  3)、Adapter中:
    在Adapter中使用ViewUtils也有一点小小的区别,具体方法如下
    
     public class PostListAdapter extends BaseAdapter {
       private List<Post> posts;
        private ViewHolder holder;

     public PostListAdapter(List<Post> posts) {
     this.posts = posts;
    }

    @Override
    public int getCount() {
    return posts.size();
    }

     @Override
    public Object getItem(int position) {
    return posts.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 = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_post_list_item, null);
    holder = new ViewHolder();
     x.view().inject(holder, convertView);
     convertView.setTag(holder);
     } else {
     holder = (ViewHolder) convertView.getTag();
     }
     holder.tvTitle.setTag(post.get(position).getTitle());
     holder.tvContent.setText(posts.get(position).getContent());
     holder.tvTime.setText(posts.get(position).getDate_time());
    return convertView;
    }

     private class ViewHolder {
     @ViewInject(R.id.post_title_show)
    public TextView tvTitle;
     @ViewInject(R.id.post_content_show)
     public TextView tvContent;
    @ViewInject(R.id.post_time_show)
    public TextView tvTime;
    }
    }
    在我们定义的ViewHolder中为控件添加注解,在adapter的getView中创建一个ViewHolder对象,使用x.view().inject(holder,convertView)就完成了findViewById操作。
   


posted @ 2017-05-08 00:23  二号程序猿  阅读(479)  评论(0编辑  收藏  举报