Bmob在Android上的应用

前言

一直很困惑,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,今天的内容就讲到这里了,谢谢诶。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Bmob创建应用的 AppId可以和我们本地的应用不同哦,包名都不需要写,但是退送服务必须填写包名MyUser u...
    一直以来都很好阅读 1,100评论 0 4
  • REST API 可以让你用任何支持发送 HTTP 请求的设备来与 Parse 进行交互,你可以使用 REST A...
    Caroline嗯哼阅读 2,002评论 0 0
  • 不完成计划,绝对不去玩儿!到了计划点,放下手头所有事去全心全意完成计划!不要忘了,你只给自己留了考研一条路!现在努...
    Joyeva阅读 143评论 0 0
  • 2016-05-07 华杉 没有什么事做不到,主要是看做领导的,能不能率先垂范。领导能做到,大家都能做到。 【滕定...
    郁萍阅读 426评论 0 0
  • 学习UIScreenEdgePanGestureRecognizer手势 最近几天一直搞首页的框架,看了一些轮子,...
    君赏阅读 2,342评论 5 0