Bmob实现android云端存储
前言
一直很困惑,android到底能不能将本地数据传到一个公共的云端,让云端实现数据库功能,这样的话,我们的单击版就能实现“联网”了。于是就产生了此篇文章。
今天讲解以下内容
- bmob后台介绍
 - bmob配置
 - bmob的封装及初始化
 - bmob对于数据处理的方式
 - bmob处理数据
 - 项目结构图和效果图
 
程序实现
一. bmob后台介绍
最开始你需要在bmob官网上注册账号,然后登录进去,创建应用(bmob官网地址及详细文档我在demo的BmobDBHelper类的开头已经说明),会生成应用的applicationId,这个在后面会用到
二. 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类中,大家可以在自己应用的Application中初始化你的bmob,类似如下:
public class AppContext extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        //bmob数据库初始化
        BmobDBHelper.getInstance().init(this);
    }
这里还需要强调的一点是,在BmobDBHelper类中有这么一段代码:
private static final String APPLICATION_ID="XXXXXXXXXX";
其中 APPLICATION_ID 表示应用的application,“XXXXXXXXXX”为你创建的应用的applicationId值。
四.bmob对于数据处理的方式
bmob对于数据的增删改查同样遵循orm,即数据是以操作对象的方式来进行增删改查的,并且操作对象需要继承于bmob机制中的一个BmobObject类
五.bmob处理数据
数据的处理无非就是增删改查,下面做详细讲解
5.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(objectId==null){
                    //添加成功
                    LogUtil.e(MainActivity.class,"========objectId="+objectId);
                }else{
                    //添加失败
                    LogUtil.e(MainActivity.class,"========e="+e.getErrorCode()+"   errorMessage="+e.getMessage());
                }
            }
        });
    }
5.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());
                }
            }
        });
    }
5.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());
                }
            }
        });
    }
5.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同样支持批量操作,接着往下讲
5.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,否则接下来的代码会报错。
5.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());
                }
            }
        });
    }
5.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还支持多个操作依次进行,最后提交的处理
5.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());
                }
            }
        });
    }
5.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());
                }
            }
        });
    }
5.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官网地址及详细文档我在demo的BmobDBHelper类的开头已经说明)做更多了解
六.项目结构图和效果图
项目结构图

运行效果图

Bmob实现android云端存储
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
Bmob实现android云端存储的更多相关文章
- 【Android开发日记】之入门篇(七)——Android数据存储(上)
		
在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...
 - 【Android开发日记】之入门篇(八)——Android数据存储(下)
		
废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...
 - Android数据存储之Android 6.0运行时权限下文件存储的思考
		
前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...
 - Android数据存储之SQLCipher数据库加密
		
前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...
 - Android数据存储之GreenDao 3.0 详解
		
前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...
 - Android SharedPreferences存储
		
原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/Android_SharedPreferences.html 一 概念 SharedPreferen ...
 - Android数据存储方式--SharedPreferences
		
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
 - Android 媒体存储服务(二)
		
Android 媒体存储服务 简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套 ...
 - Android 媒体存储服务(一)
		
Android 媒体存储服务 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 ...
 
随机推荐
- ECShop安装实录
			
版本: ecmoban_V2.7.3_UTF8_20150623 来源: 官网 一. 给 C:\Windows\temp目录增加 IIS_Users 完全权限. 二. 安装报错: Warning: d ...
 - appium+python自动化24-滑动方法封装(swipe)【转载】
			
swipe介绍 1.查看源码语法,起点和终点四个坐标参数,duration是滑动屏幕持续的时间,时间越短速度越快.默认为None可不填,一般设置500-1000毫秒比较合适. swipe(self, ...
 - hdu 2461(AC) & poj 3695(TLE)(离散化+矩形并)
			
Rectangles Time Limit: 5000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
 - 使用Vagrant打造Linux开发环境
			
1.安装Oracle VM VirtualBox.vagrant,安装完成需重启电脑 Oracle VM VirtualBox安装包下载:https://www.virtualbox.org/wiki ...
 - [BZOJ1051][HAOI2006] 受欢迎的牛 tarjan求联通分量
			
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5687 Solved: 3016[Submit][Sta ...
 - 大数据技术之_16_Scala学习_09_函数式编程-高级
			
第十三章 函数式编程-高级13.1 偏函数(partial function)13.1.1 提出一个需求,引出思考13.1.2 解决方式-filter + map 返回新的集合13.1.3 解决方式- ...
 - springMVC笔记:jsp页面获取后台数据记录列表
			
1.读取数据库中的记录List<HashMap<String,String>> attributes; 2.Controller构造Model如下: @RequestMappi ...
 - l洛谷——P1211 [USACO1.3]牛式 Prime Cryptarithm
			
P1211 [USACO1.3]牛式 Prime Cryptarithm 题目描述 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. *** x ** ...
 - POJ3261 Milk Patterns(二分+后缀数组)
			
题目求最长的重复k次可重叠子串. 与POJ1743同理. 二分枚举ans判定是否成立 height分组,如果大于等于ans的组里的个数大于等于k-1,这个ans就可行 #include<cstd ...
 - Linux下安装PHP的GD支持库
			
Linux下安装PHP的GD支持库 1.安装 zlib wget ftp://ftp.sunfreeware.com/pub/freeware/SOURCES/zlib-1.2.3.tar.gz ...