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操作。