Bmob在Android上的应用

作者: 奔跑的佩恩 | 来源:发表于2018-03-02 10:19 被阅读171次

    前言

    一直很困惑,android到底能不能将本地数据传到一个公共的云端,让云端实现数据库功能,这样的话,我们的单击版就能实现“联网”了。于是就产生了此篇文章。
    本文参考以下链接
    bmob官网
    bmob官网开发文档
    bmob是一个集结多种功能的第三方平台,今天我们主要讲数据存储,今天的内容涉及以下内容:

    1. bmob后台介绍
    2. bmob配置
    3. bmob的封装
    4. bmob的初始化
    5. bmob对于数据处理的方式
    6. bmob处理数据
    7. bmob云端查看数据
    一. bmob后台介绍

    进入bmob官网注册账号,然后点击"我的控制台"

    image.png
    进入
    image.png
    然后创建应用,应用创建成功后,点击应用,进入应用界面,点击设置
    image.png
    进去后便可以看到应用的 ApplicationID等相关信息,这个在后面会用到。及此,对于bmob后台的简单介绍已经完毕
    二. bmob配置

    首先在你的project的builder.gradle中添加依赖:

    buildscript {
        
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.0'
    
    
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
    
            //Bmob的maven仓库地址--必填
            maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    然后在 app对应的 build.gradle中添加依赖:

    apply plugin: 'com.android.application'
    
        android {
            compileSdkVersion 22
            buildToolsVersion '22.0.1'
    
            **兼容Android6.0系统所需,如果这句话报错,可在dependencies标签下使用compile 'cn.bmob.android:http-legacy:1.0'**
            useLibrary 'org.apache.http.legacy'
    
            ...
        }
    
    
        dependencies {
        //以下SDK开发者请根据需要自行选择
        //bmob-sdk:Bmob的android sdk包,包含了Bmob的数据存储、文件等服务,以下是最新的bmob-sdk:
        //3.5.5:请务必查看下面注释[1]
        compile 'cn.bmob.android:bmob-sdk:3.5.5'
        //如果你想应用能够兼容Android6.0,请添加此依赖(org.apache.http.legacy.jar)
        compile 'cn.bmob.android:http-legacy:1.0'
    
        ...
        }
    
    三.bmob的封装

    我将bmob的初始化封装到BmobDBHelper类中,代码如下:

    package com.android.helper;
    
    import android.content.Context;
    
    import cn.bmob.v3.Bmob;
    import cn.bmob.v3.BmobConfig;
    
    /**
     * Title:Bmob数据存储帮助类
     * Description:
     * <p>
     * Created by pei
     * Date: 2018/2/27
     */
    public class BmobDBHelper {
    
       //这里APPLICATION_ID写你自己应用的ApplicationID
        private static final String APPLICATION_ID="XXXXXXXXX";
    
    
        private BmobDBHelper() {
        }
    
        private static class Holder {
            private static BmobDBHelper instance = new BmobDBHelper();
        }
    
        public static BmobDBHelper getInstance() {
            return Holder.instance;
        }
    
        /**初始化**/
        public void init(Context context){
            //自v3.4.7版本开始,设置BmobConfig,允许设置请求超时时间、文件分片上传时每片的大小、文件的过期时间(单位为秒),
            BmobConfig config = new BmobConfig.Builder(context)
                    .setApplicationId(APPLICATION_ID)//设置appkey
    //                .setConnectTimeout(30)//请求超时时间(单位为秒):默认15s
    //                .setUploadBlockSize(1024*1024)//文件分片上传时每片的大小(单位字节),默认512*1024
    //                .setFileExpiration(2500)//文件的过期时间(单位为秒):默认1800s
                    .build();
            Bmob.initialize(config);
        }
    
    }
    

    上面的APPLICATION_ID写你自己应用的ApplicationID

    四.bmob的初始化

    在你自己的application中初始化bmob

    public class AppContext extends Application{
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            //bmob数据库初始化
            BmobDBHelper.getInstance().init(this);
        }
    
    五. bmob对于数据处理的方式

    bmob对于数据的增删改查同样遵循orm,即数据是以操作对象的方式来进行增删改查的,并且操作对象需要继承于bmob机制中的一个BmobObject类,下面以Person类为例,我们需要向服务器存储用户的昵称,年龄以及是否为会员,则Person可以这样写:

    package com.android.model;
    
    import cn.bmob.v3.BmobObject;
    
    /**
     * Title:
     * Description:
     * <p>
     * Created by pei
     * Date: 2018/2/27
     */
    public class Person extends BmobObject {
    
        private String nickName;
        private Integer age;
        private Boolean isVip;
    
        public String getNickName() {
            return nickName;
        }
    
        public void setNickName(String nickName) {
            this.nickName = nickName;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Boolean getVip() {
            return isVip;
        }
    
        public void setVip(Boolean vip) {
            isVip = vip;
        }
    }
    
    六. bmob处理数据

    数据的处理无非就是增删改查,下面做详细讲解

    6.1 添加单条数据
        private void insert(){
            Person person=new Person();
            person.setNickName("大grds");
            person.setAge(20);
            person.setVip(false);
    
            person.save(new SaveListener<String>() {
                @Override
                public void done(String objectId, BmobException e) {
                    if(e==null){
                        //添加成功
                        LogUtil.e(MainActivity.class,"========objectId="+objectId);
                    }else{
                        //添加失败
                        LogUtil.e(MainActivity.class,"========e="+e.getErrorCode()+"   errorMessage="+e.getMessage());
                    }
                }
            });
        }
    
    6.2 更新单条数据

    每条数据添加后,在后端云会形成一个ObjectId,即唯一id,操作单条数据的时候根据ObjectId进行更新,下面代码中的“XXXXXX”即为对应数据的ObjectId

    private void update(){
            Person p=new Person();
            p.setAge(80);
            p.update("XXXXXX", new UpdateListener() {
                @Override
                public void done(BmobException e) {
                    if(e==null){
                        LogUtil.e(MainActivity.class,"===更新成功===");
                    }else{
                        LogUtil.e(MainActivity.class,"更新失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
    
            });
        }
    
    6.3 删除单条数据

    下面的“objectId”为云数据库中对应数据的唯一id

     /**删除整条数据**/
        private void deleteObject(){
            Person p=new Person();
            p.setObjectId("objectId");
            p.delete(new UpdateListener() {
                @Override
                public void done(BmobException e) {
                    if(e==null){
                        LogUtil.e(MainActivity.class,"===删除成功===");
                    }else{
                        LogUtil.e(MainActivity.class,"删除失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
            });
        }
    
    6.4 删除单条数据中的某个属性

    例如我要删掉objectId=“qiueoieqc”的person数据中的age信息,我可以这样操作:

    /**删除单条数据中的某个信息**/
        private void deleteAttribute(){
            Person p=new Person();
            p.setObjectId("qiueoieqc");
            p.remove("age");
            p.update(new UpdateListener() {
                @Override
                public void done(BmobException e) {
                    if(e==null){
                        LogUtil.e(MainActivity.class,"===删除属性成功===");
                    }else{
                        LogUtil.e(MainActivity.class,"删除属性失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
            });
        }
    

    bmob同样支持批量操作,接着往下讲

    6.5 批量添加

    增加多条数据,你可以这样操作:

        /**批量添加**/
        private void insertList(){
            //注:泛型要写BmobObject,不能写Person
            List<BmobObject>personList=new ArrayList<>();
            for(int i=0;i<3;i++){
                Person person=new Person();
                person.setNickName("小花"+i);
                personList.add(person);
            }
    
            new BmobBatch().insertBatch(personList).doBatch(new QueryListListener<BatchResult>() {
                @Override
                public void done(List<BatchResult> list, BmobException e) {
                    for(int i=0;i<list.size();i++){
                        BatchResult result = list.get(i);
                        BmobException ex =result.getError();
                        if(ex==null){
                            LogUtil.e("第"+i+"个数据批量添加成功:"+result.getCreatedAt()+","+result.getObjectId()+","+result.getUpdatedAt());
                        }else{
                            LogUtil.e("第"+i+"个数据批量添加失败:"+ex.getMessage()+","+ex.getErrorCode());
                        }
                    }
                }
            });
        }
    

    需要注意的是

    List<BmobObject>personList=new ArrayList<>();
    

    中泛型必须用Person的父类BmobObject,不能直接用Person,否则接下来的代码会报错。

    6.6 批量更新

    更新多条数据,你可以这样:

    /**批量更新**/
        private void updateList(){
            //注:泛型要写BmobObject,不能写Person
            List<BmobObject>personList=new ArrayList<>();
            Person person1=new Person();
            person1.setObjectId("1cd61bcbe6");
            person1.setAge(21);
            Person person2=new Person();
            person2.setObjectId("7ac232f13e");
            person2.setAge(22);
            Person person3=new Person();
            person3.setObjectId("31ff64b2bd");
            person3.setAge(23);
    
            personList.add(person1);
            personList.add(person2);
            personList.add(person3);
    
            new BmobBatch().updateBatch(personList).doBatch(new QueryListListener<BatchResult>() {
                @Override
                public void done(List<BatchResult> list, BmobException e) {
                    if(e==null){
                        for(int i=0;i<list.size();i++){
                            BatchResult result = list.get(i);
                            BmobException ex =result.getError();
                            if(ex==null){
                                LogUtil.e("第"+i+"个数据批量更新成功:"+result.getUpdatedAt());
                            }else{
                                LogUtil.e("第"+i+"个数据批量更新失败:"+ex.getMessage()+","+ex.getErrorCode());
                            }
                        }
                    }else{
                        LogUtil.e("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
            });
        }
    
    6.7 批量删除
        /**批量删除**/
        private void deleteList(){
            //注:泛型要写BmobObject,不能写Person
            List<BmobObject>personList=new ArrayList<>();
            Person person1=new Person();
            person1.setObjectId("31ff64b2bd");
    
            Person person2=new Person();
            person2.setObjectId("7ac232f13e");
    
            Person person3=new Person();
            person3.setObjectId("1cd61bcbe6");
    
            Person person4=new Person();
            person4.setObjectId("0aa285d0ac");
    
            Person person5=new Person();
            person5.setObjectId("eea3673beb");
    
            Person person6=new Person();
            person6.setObjectId("7e6b41915a");
    
            Person person7=new Person();
            person7.setObjectId("4d4ab16631");
    
            personList.add(person1);
            personList.add(person2);
            personList.add(person3);
            personList.add(person4);
            personList.add(person5);
            personList.add(person6);
            personList.add(person7);
    
            new BmobBatch().deleteBatch(personList).doBatch(new QueryListListener<BatchResult>() {
                @Override
                public void done(List<BatchResult> o, BmobException e) {
                    if(e==null){
                        for(int i=0;i<o.size();i++){
                            BatchResult result = o.get(i);
                            BmobException ex =result.getError();
                            if(ex==null){
                                LogUtil.e("第"+i+"个数据批量删除成功");
                            }else{
                                LogUtil.e("第"+i+"个数据批量删除失败:"+ex.getMessage()+","+ex.getErrorCode());
                            }
                        }
                    }else{
                        Log.i("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
            });
        }
    

    bmob还支持多个操作依次进行,最后提交的处理

    6.8 批量添加、批量更新、批量删除同步提交
       /**批量添加、批量更新、批量删除同步提交**/
        private void controList(){
            LogUtil.e(MainActivity.class,"=======批量添加、批量更新、批量删除=======");
    
            BmobBatch batch =new BmobBatch();
            //批量添加
            List<BmobObject> persons = new ArrayList<BmobObject>();
            Person person = new Person();
            person.setNickName("张三 ");
            persons.add(person);
            batch.insertBatch(persons);
    
            //批量更新
            List<BmobObject> persons1=new ArrayList<BmobObject>();
            Person p1 = new Person();
            p1.setObjectId("ec4886adaa");
            p1.setAge(35);
            persons1.add(p1);
            batch.updateBatch(persons1);
    
            //批量删除
            List<BmobObject> persons2 = new ArrayList<BmobObject>();
            Person p2 = new Person();
            p2.setObjectId("5798716e7f");
            persons2.add(p2);
            batch.deleteBatch(persons2);
            //执行批量操作
            batch.doBatch(new QueryListListener<BatchResult>() {
                @Override
                public void done(List<BatchResult> list, BmobException e) {
                    if(e==null){
                        //返回结果的results和上面提交的顺序是一样的,请一一对应
                        for(int i=0;i<list.size();i++){
                            BatchResult result= list.get(i);
                            if(result.isSuccess()){//只有批量添加才返回objectId
                                LogUtil.e("第"+i+"个成功:"+result.getObjectId()+","+result.getUpdatedAt());
                            }else{
                                BmobException error= result.getError();
                                LogUtil.e("第"+i+"个失败:"+error.getErrorCode()+","+error.getMessage());
                            }
                        }
                    }else{
                        LogUtil.e("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
            });
        }
    
    6.9 单条数据查询
        /**单个查询**/
        private void checkByObjectId(){
            new BmobQuery<Person>().getObject("5798716e7f", new QueryListener<Person>() {
                @Override
                public void done(Person person, BmobException e) {
                    if(e==null){
                        //获得createdAt数据创建时间(注意是:createdAt,不是createAt)
                        LogUtil.e(MainActivity.class,"======person  getNickName="+person.getNickName()+"  getObjectId="+person.getObjectId()+"   getCreatedAt="+person.getCreatedAt());
                    }else{
                        LogUtil.e("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
            });
        }
    
    6.10 查询多条数据

    最多支持一次查询500条数据

       /**查询多条数据,查询的数据条数最多500**/
        private void checkList(){
            BmobQuery<Person> query = new BmobQuery<Person>();
            //查询playerName叫“比目”的数据
            query.addWhereEqualTo("nickName", "大鱼");
            //返回50条数据,如果不加上这条语句,默认返回10条数据
            query.setLimit(50);
            //执行查询方法
            query.findObjects(new FindListener<Person>() {
                @Override
                public void done(List<Person> object, BmobException e) {
                    if(e==null){
                        for (Person person : object) {
                            //获得createdAt数据创建时间(注意是:createdAt,不是createAt)
                            LogUtil.e(MainActivity.class,"==kk====person  getNickName="+person.getNickName()+"  getObjectId="+person.getObjectId()+"   getCreatedAt="+person.getCreatedAt());
                        }
                    }else{
                        Log.i("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
                    }
                }
            });
        }
    

    这里需要解释下,其实关于bmob的查询还有很多情况,这里就不详细讲解了,因为关于数据库的查询操作本来就是变化万千,最头疼的一环,大家可以参看bmob官网开发文档做更多了解

    七. bmob云端查看数据

    数据添加了,删除了什么的,肯定想看看结果了,这时你可以登录你的bmob后端云,然后进入你的控制台,进入你的应用,点击左侧数据,然后点击Person表(表名一般以对象名称形成,区分大小写),即可看到你的数据,如下图:


    image.png

    ok,今天的内容就讲到这里了,谢谢诶。

    相关文章

      网友评论

        本文标题:Bmob在Android上的应用

        本文链接:https://www.haomeiwen.com/subject/lcxgxftx.html