用Bmob实现用户数据添加和查询显示

我用的例子利用Bmob云服务器实现了让用户上传待出售商品信息,以及能浏览在售商品信息的小功能。刚接触Bmob感觉它确实好用,但我不得不吐槽那个案例更新的太慢了,新版本的SDK跟老版本还是有很大差别的,建议更新SDK的同时也更新一下案例。再就是文档写的不怎么详细。好了,废话不多说,先看一下我的效果图:

用Bmob实现用户数据添加和查询显示_第1张图片用Bmob实现用户数据添加和查询显示_第2张图片用Bmob实现用户数据添加和查询显示_第3张图片用Bmob实现用户数据添加和查询显示_第4张图片

其中,主要问题就是用户数据上传数据的下载显示在屏幕上

注意啦:

在这里我用的是Bmob目前最新的android SDK版本,这个配置也泼烦的很,新版本和旧版本有很多方法有很大差异,如果大家用的不是我的这个版本的请先看一下这个SDK版本的具体配置方法http://blog.csdn.net/flx413/article/details/52475766 我就是按照这个来的!



一:用户数据上传的实现:

goods_add.setOnClickListener(new View.OnClickListener() {	//"上架"按钮的监听事件
            @Override
            public void onClick(View v) {
                final String name, desc, icon_path;
                final double price;
                name = goods_name.getText().toString();
                desc = goods_desc.getText().toString();
                price = Double.parseDouble(goods_price.getText().toString());//得到浮点数

                //获取文件路径
                //icon_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/1.jpg";
                icon_path = imagePath;
                System.out.println(imagePath);
                final BmobFile bmobfile = new BmobFile(new File(icon_path));
                bmobfile.upload(new UploadFileListener() {
                    @Override
                    public void done(BmobException e) {
                        if (e == null) {	//为空说明没有异常
                            System.out.println("图片上传成功");
                            Goods goods = new Goods();
                            goods.setName(name);
                            goods.setDesc(desc);
                            goods.setPrice(price);
                            goods.setIcon(bmobfile);
                            goods.save(new SaveListener() {
                                @Override
                                public void done(String s, BmobException e) {
                                    if (e == null) {
                                        Toast.makeText(AddActivity.this, "添加数据成功,:", Toast.LENGTH_SHORT).show();
                                        System.out.println("添加数据成功");
                                    } else {
                                        Toast.makeText(AddActivity.this, "添加数据失败", Toast.LENGTH_SHORT).show();
                                        System.out.println("添加数据失败");
                                    }
                                }
                            });
                        } else {
                            Toast.makeText(AddActivity.this, "文件上传失败", Toast.LENGTH_SHORT).show();
                            System.out.println("文件上传失败");
                        }
                    }
                });
                finish();
            }

        });
    }

由于我的程序中设定用那个户上传的商品信息包括商品图片(BmobFile)、商品名称和描述(String)、商品价格(double),所以我先上传图片,通过取得的图片路径上传,用的是Bmob SDK中的upload()方法。文件上传成功后再上传商品的其他信息,调用sava()方法。上传之后能在表里面看到你上传的内容

用Bmob实现用户数据添加和查询显示_第5张图片

二:数据查询和显示功能的实现

//获取数据
    private void loadDate() {
       
        BmobQuery bmobQuery = new BmobQuery();
        bmobQuery.findObjects(new FindListener() {  //按行查询,查到的数据放到List的集合
            @Override
            public void done(List list, BmobException e) {
                if (e == null){	
   //System.out.println("查询成功"+list.get(0).getName()+list.get(0).getPrice()+list.get(0).getDesc());
                    listView.setAdapter(new MyAdapter(GroundActivity.this , list));
                    }

                }
        });
    }
查询我是按表的行来查询的,调用BmobQuery.findObjects()方法即可以实现,查询的结果是一个List

集合,现在已经取得了数据,但是要显示数据还需要写一个适配器(Adapter)将数据放到adapter中显示出来,我在

这个地方走了很多弯路,试了很多中方法,终于还是成功了。下面是我的适配器的代码:

class MyAdapter extends BaseAdapter {
        private Context context ;
        private List list;
        public MyAdapter(Context context, List list){
            this.context = context;
            this.list = list;
        }

        @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(final int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;
            if (convertView == null){
                String name;
                String desc;
                double price;
                BmobFile image;
                    name = list.get(position).getName();
                    desc = list.get(position).getDesc();
                    price = list.get(position).getPrice();
                    image = list.get(position).getIcon();
                    System.out.println(image.getFileUrl());
                LayoutInflater inflater = LayoutInflater.from(context);
                convertView = inflater.inflate(R.layout.item_layout, null);//实例化一个布局文件
                viewHolder = new ViewHolder();
                viewHolder.iv_img = (ImageView)convertView.findViewById(R.id.iv);
                viewHolder.tv_name = (TextView)convertView.findViewById(R.id.tv_name);
                viewHolder.tv_price = (TextView)convertView.findViewById(R.id.tv_price);
                viewHolder.tv_desc = (TextView)convertView.findViewById(R.id.tv_desc);
                convertView.setTag(viewHolder);
                //不能直接在主线程中进行从网络端获取图片,而需要单独开一个子线程完成从网络端获取图片
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //根据表中图片的url地址来得到图片(Bitmap类型)
                        final Bitmap bitmap=getPicture(list.get(position).getIcon().getFileUrl());
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        viewHolder.iv_img.post(new Runnable() {
                            @Override
                            public void run() {
                                System.out.println("*********************************");
                                viewHolder.iv_img.setImageBitmap(bitmap);//将图片放到视图中去
                            }
                        });
                    }
                }).start();
                viewHolder.tv_name.setText(name);
                viewHolder.tv_price.setText(String.valueOf(price));   //将double数据放到textView中
                viewHolder.tv_desc.setText(desc);

            }else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            return convertView;
        }
        class ViewHolder{
            ImageView iv_img;
            TextView tv_name;
            TextView tv_price;
            TextView tv_desc;
        }
    }
我得到图片是 先通过 list.get(position).getIcon().getFileUrl()来得到图

片的url地址,再根据url地址来得到图片,需要注意的是通过url地址获得图片,和将图片放到view

视图中这两个工作需要放到一个子线程里面去,否则就会报错(我也不太了解),通过URL地址来得到

图片的方法如下:

public Bitmap getPicture(String path){
        Bitmap bm=null;
        try{
            URL url=new URL(path);
            URLConnection connection=url.openConnection();
            connection.connect();
            InputStream inputStream=connection.getInputStream();
            bm= BitmapFactory.decodeStream(inputStream);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  bm;
    }
至此基本上就算是大功告成了。希望对大家有帮助。

完整工程下载:链接:http://pan.baidu.com/s/1eSDPL30 密码:uqev

你可能感兴趣的:(android)