xUtils的全面解析和案例讲解(三)

在上一篇博客的基础上,我们来增加新的功能,进一步学习xUtils框架当中的数据库模块。

新增的需求:在有网络的情况下,加载网络数据,并且显示出来,在没有网络的情况下,加载数据库当中的数据,同样显示出来,

其实就是增加了缓存操作。那么我们在之前的基础上,又应该做什么操作呢?

1.首先要在清单文件当中增加获取sd卡当中数据的权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.分析要修改哪些类当中的内容:
     既然需要保存到数据库当中,可以要有对于数据库的操作,就要使用xUtil模块对于数据库进行操作。
     要对于我们解析数据的bean类进行分析,发现集合当中的每一个对象,就相当于一条数据,集合的泛型所代表的类
其实就是数据库当中的表。
      在获取数据成功之后,需要展示数据同时也要将数据存放到表当中。获取数据失败失败时,直接从数据库获取数据,
所以要对于网络请求框架进行编写。
 
根据以上我们的分析,开始修改逻辑代码:
首先修改一个解析类bean的代码部分:
 
/**
 * Created by Administrator 
 * 回顾将数据存放到数据库当中的过程:
 * 1.创建一个类,继承SQLiteOpenHelper类。并且重写onCreate和onUpgrade两个方法
 *   在onCreate当中来创建表。然后去写插入语句
 * 2.在使用数据库时,获取表当中的信息,首先获得数据库对象,要使用构造函数得到SQLiteOpenHelper对象
 *   调用getReadableDatabase或者getWritableDatabase的方法。获得数据库对象
 * 3.调用数据库当中增删改查的方法对于表进行操作。
 *
 * 写xUtils的数据库的时候,要明确数据库的表当中存放什么,集合当中的每一条数据就对应了表当中的每一条数据
 * 所以集合当中的类,就表示表当中的数据,一个对象就是一条。类就相当于那张表
 * 表当中的字段其实就是类的属性
 *1. xUtils的数据库模块如何建表呢?
 *在类名上一行,添加注解 @Table(name = "xxx") 表示当前的类会被创建成表。name属性后对应的值,就是表的名称
 *2.怎么去创建类当中的字段呢?
 * 在类中成员变量的上一行,添加注解 @Column(name = "xxx") name属性对应的值就表示字段
 *3.注意事项:
 *  这个类当中必须有一个属性是作为主键的,否则不会创建成功。isId=true
 *  autoGen=false  表示自增长 如果不写,默认自增长。
 */
public class RichBean {
    private int ret;
    private List<DataBean> data;
    public int getRet() {
        return ret;
    }
    public void setRet(int ret) {
        this.ret = ret;
    }
    public List<DataBean> getData() {
        return data;
    }
    public void setData(List<DataBean> data) {
        this.data = data;
    }
    @Table(name = "food")
    public static class DataBean {
        @Column(name = "_id",isId = true, autoGen= false)
         private String id;
        @Column(name = "title")
        private String title;
        @Column(name = "pic")
        private String pic;
        @Column(name="collect_num")
        private String collect_num;
        @Column(name = "food_str")
        private String food_str;
        @Column(name = "num")
        private int num;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getPic() {
            return pic;
        }
        public void setPic(String pic) {
            this.pic = pic;
        }
        public String getCollect_num() {
            return collect_num;
        }
        public void setCollect_num(String collect_num) {
            this.collect_num = collect_num;
        }
        public String getFood_str() {
            return food_str;
        }
        public void setFood_str(String food_str) {
            this.food_str = food_str;
        }
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
    }
}

然后在使用xUtils的数据库模块时,要对于数据库的信息进行封装,需要写一个封装类:
 
public class DBUtils {
    public static DbManager.DaoConfig getConfig(Context context){
        DbManager.DaoConfig config = new DbManager.DaoConfig();
        config.setDbName("user.db");   //设置数据库名称
        config.setDbVersion(1);   //设置数据库的版本号
        config.setDbDir(context.getExternalCacheDir());  //存放到sd卡的缓存当中
        return config;
    }
}
 接下来,我们修改了activity当中的网络请求部分: 
 
@ContentView(R.layout.activity_food)
public class FoodActivity extends AppCompatActivity {
    @ViewInject(R.id.food_rv)
    private RecyclerView foodRv;
    private LinearLayoutManager manager;
    private String url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1";
    private List<RichBean.DataBean> mDatas;
    private RichAdapter adapter;
    private DbManager dbManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);
//        设置布局管理者
        manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        foodRv.setLayoutManager(manager);
//        设置数据源
        mDatas = new ArrayList<>();
//        设置适配器
        adapter = new RichAdapter(this,mDatas);
        foodRv.setAdapter(adapter);
//        加载网络数据
        loadWebData(url);

//        获取xUtils的数据库管理者  DaoConfig:代表数据库的配置对象
        DbManager.DaoConfig config = DBUtils.getConfig(this);
        dbManager = x.getDb(config);   //数据库管理者

//       练习删除某一条数据,给recyclerview添加长按时间,长按哪条删除哪条


    }
//    使用xUtils的网络模块加载网络数据
    private void loadWebData(String url) {
        RequestParams params = new RequestParams(url);
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String s) {
//                解析数据
                Gson gson = new Gson();
                RichBean bean = gson.fromJson(s, RichBean.class);
                List<RichBean.DataBean> list = bean.getData();
//                将集合添加到数据源里
                mDatas.addAll(list);
//                提示适配器更新数据
                adapter.notifyDataSetChanged();
//                获取到数据之后,要对于数据进行存放
                for (int i = 0; i < mDatas.size(); i++) {
                    RichBean.DataBean dataBean = mDatas.get(i);
                    try {
                        dbManager.save(dataBean);   //存放对象到表当中
                    } catch (DbException e) {
                        e.printStackTrace();
                    }
                }
            }
            @Override
            public void onError(Throwable throwable, boolean b) {
//                网络获取失败,查找表当中的内容,显示到集合当中
                try {
                    List<RichBean.DataBean> beanList = dbManager.findAll(RichBean.DataBean.class);
                    mDatas.addAll(beanList);
                    adapter.notifyDataSetChanged();   //通知adapter更新数据
                } catch (DbException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onCancelled(CancelledException e) {
            }
            @Override
            public void onFinished() {
            }
        });
    }
}

附加条件,希望能够增加长按事件:在adapter当中的onBindViewHolder方法里添加新的代码(只展示新增的部分)
 
 @Override
    public void onBindViewHolder(RichViewHolder holder, final int position) {
        final RichBean.DataBean bean = mDatas.get(position);
        holder.nameTv.setText(bean.getTitle());
        holder.foodTv.setText(bean.getFood_str());
        holder.numTv.setText("数量:"+bean.getCollect_num());
//        使用xutils的图片模块加载图片
        x.image().bind(holder.img,bean.getPic());
//        添加长按事件
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
//                逻辑:删除长按那条数据,并且从数据库当中也删除这条数据
                mDatas.remove(position);
                RichAdapter.this.notifyDataSetChanged();
                DbManager manager = x.getDb(DBUtils.getConfig(context));
                try {
//                    从数据库当中删除这条数据
                    manager.deleteById(RichBean.DataBean.class,bean.getId());
                } catch (DbException e) {
                    e.printStackTrace();
                }
                return false;
            }
        });
    }

完成以上代码,运行一下,就会发现,数据库当中存放数据了,没有网络也能展示数据。并且长按会删除数据。效果图如下所示:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值