代码地址如下:
http://www.demodashi.com/demo/12547.html

前言

一直很困惑,android到底能不能将本地数据传到一个公共的云端,让云端实现数据库功能,这样的话,我们的单击版就能实现“联网”了。于是就产生了此篇文章。

今天讲解以下内容

  1. bmob后台介绍
  2. bmob配置
  3. bmob的封装及初始化
  4. bmob对于数据处理的方式
  5. bmob处理数据
  6. 项目结构图和效果图

程序实现

一. bmob后台介绍

最开始你需要在bmob官网上注册账号,然后登录进去,创建应用(bmob官网地址及详细文档我在demo的BmobDBHelper类的开头已经说明),会生成应用的applicationId,这个在后面会用到

二. bmob配置

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

  1. buildscript {
  2. repositories {
  3. google()
  4. jcenter()
  5. }
  6. dependencies {
  7. classpath 'com.android.tools.build:gradle:3.0.0'
  8. }
  9. }
  10. allprojects {
  11. repositories {
  12. google()
  13. jcenter()
  14. //Bmob的maven仓库地址--必填
  15. maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
  16. }
  17. }
  18. task clean(type: Delete) {
  19. delete rootProject.buildDir
  20. }

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

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

三.bmob的封装及初始化

我将bmob的初始化封装到BmobDBHelper类中,大家可以在自己应用的Application中初始化你的bmob,类似如下:

  1. public class AppContext extends Application{
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. //bmob数据库初始化
  6. BmobDBHelper.getInstance().init(this);
  7. }

这里还需要强调的一点是,在BmobDBHelper类中有这么一段代码:

  1. private static final String APPLICATION_ID="XXXXXXXXXX";

其中 APPLICATION_ID 表示应用的application,“XXXXXXXXXX”为你创建的应用的applicationId值。

四.bmob对于数据处理的方式

bmob对于数据的增删改查同样遵循orm,即数据是以操作对象的方式来进行增删改查的,并且操作对象需要继承于bmob机制中的一个BmobObject类

五.bmob处理数据

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

5.1 添加单条数据
  1. private void insert(){
  2. Person person=new Person();
  3. person.setNickName("大grds");
  4. person.setAge(20);
  5. person.setVip(false);
  6. person.save(new SaveListener<String>() {
  7. @Override
  8. public void done(String objectId, BmobException e) {
  9. if(objectId==null){
  10. //添加成功
  11. LogUtil.e(MainActivity.class,"========objectId="+objectId);
  12. }else{
  13. //添加失败
  14. LogUtil.e(MainActivity.class,"========e="+e.getErrorCode()+" errorMessage="+e.getMessage());
  15. }
  16. }
  17. });
  18. }
5.2 更新单条数据

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

  1. private void update(){
  2. Person p=new Person();
  3. p.setAge(80);
  4. p.update("XXXXXX", new UpdateListener() {
  5. @Override
  6. public void done(BmobException e) {
  7. if(e==null){
  8. LogUtil.e(MainActivity.class,"===更新成功===");
  9. }else{
  10. LogUtil.e(MainActivity.class,"更新失败:"+e.getMessage()+","+e.getErrorCode());
  11. }
  12. }
  13. });
  14. }
5.3 删除单条数据

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

  1. /**删除整条数据**/
  2. private void deleteObject(){
  3. Person p=new Person();
  4. p.setObjectId("objectId");
  5. p.delete(new UpdateListener() {
  6. @Override
  7. public void done(BmobException e) {
  8. if(e==null){
  9. LogUtil.e(MainActivity.class,"===删除成功===");
  10. }else{
  11. LogUtil.e(MainActivity.class,"删除失败:"+e.getMessage()+","+e.getErrorCode());
  12. }
  13. }
  14. });
  15. }
5.4 删除单条数据中的某个属性

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

  1. /**删除单条数据中的某个信息**/
  2. private void deleteAttribute(){
  3. Person p=new Person();
  4. p.setObjectId("qiueoieqc");
  5. p.remove("age");
  6. p.update(new UpdateListener() {
  7. @Override
  8. public void done(BmobException e) {
  9. if(e==null){
  10. LogUtil.e(MainActivity.class,"===删除属性成功===");
  11. }else{
  12. LogUtil.e(MainActivity.class,"删除属性失败:"+e.getMessage()+","+e.getErrorCode());
  13. }
  14. }
  15. });
  16. }

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

5.5 批量添加

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

  1. /**批量添加**/
  2. private void insertList(){
  3. //注:泛型要写BmobObject,不能写Person
  4. List<BmobObject>personList=new ArrayList<>();
  5. for(int i=0;i<3;i++){
  6. Person person=new Person();
  7. person.setNickName("小花"+i);
  8. personList.add(person);
  9. }
  10. new BmobBatch().insertBatch(personList).doBatch(new QueryListListener<BatchResult>() {
  11. @Override
  12. public void done(List<BatchResult> list, BmobException e) {
  13. for(int i=0;i<list.size();i++){
  14. BatchResult result = list.get(i);
  15. BmobException ex =result.getError();
  16. if(ex==null){
  17. LogUtil.e("第"+i+"个数据批量添加成功:"+result.getCreatedAt()+","+result.getObjectId()+","+result.getUpdatedAt());
  18. }else{
  19. LogUtil.e("第"+i+"个数据批量添加失败:"+ex.getMessage()+","+ex.getErrorCode());
  20. }
  21. }
  22. }
  23. });
  24. }

需要注意的是

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

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

5.6 批量更新

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

  1. /**批量更新**/
  2. private void updateList(){
  3. //注:泛型要写BmobObject,不能写Person
  4. List<BmobObject>personList=new ArrayList<>();
  5. Person person1=new Person();
  6. person1.setObjectId("1cd61bcbe6");
  7. person1.setAge(21);
  8. Person person2=new Person();
  9. person2.setObjectId("7ac232f13e");
  10. person2.setAge(22);
  11. Person person3=new Person();
  12. person3.setObjectId("31ff64b2bd");
  13. person3.setAge(23);
  14. personList.add(person1);
  15. personList.add(person2);
  16. personList.add(person3);
  17. new BmobBatch().updateBatch(personList).doBatch(new QueryListListener<BatchResult>() {
  18. @Override
  19. public void done(List<BatchResult> list, BmobException e) {
  20. if(e==null){
  21. for(int i=0;i<list.size();i++){
  22. BatchResult result = list.get(i);
  23. BmobException ex =result.getError();
  24. if(ex==null){
  25. LogUtil.e("第"+i+"个数据批量更新成功:"+result.getUpdatedAt());
  26. }else{
  27. LogUtil.e("第"+i+"个数据批量更新失败:"+ex.getMessage()+","+ex.getErrorCode());
  28. }
  29. }
  30. }else{
  31. LogUtil.e("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
  32. }
  33. }
  34. });
  35. }
5.7 批量删除
  1. /**批量删除**/
  2. private void deleteList(){
  3. //注:泛型要写BmobObject,不能写Person
  4. List<BmobObject>personList=new ArrayList<>();
  5. Person person1=new Person();
  6. person1.setObjectId("31ff64b2bd");
  7. Person person2=new Person();
  8. person2.setObjectId("7ac232f13e");
  9. Person person3=new Person();
  10. person3.setObjectId("1cd61bcbe6");
  11. Person person4=new Person();
  12. person4.setObjectId("0aa285d0ac");
  13. Person person5=new Person();
  14. person5.setObjectId("eea3673beb");
  15. Person person6=new Person();
  16. person6.setObjectId("7e6b41915a");
  17. Person person7=new Person();
  18. person7.setObjectId("4d4ab16631");
  19. personList.add(person1);
  20. personList.add(person2);
  21. personList.add(person3);
  22. personList.add(person4);
  23. personList.add(person5);
  24. personList.add(person6);
  25. personList.add(person7);
  26. new BmobBatch().deleteBatch(personList).doBatch(new QueryListListener<BatchResult>() {
  27. @Override
  28. public void done(List<BatchResult> o, BmobException e) {
  29. if(e==null){
  30. for(int i=0;i<o.size();i++){
  31. BatchResult result = o.get(i);
  32. BmobException ex =result.getError();
  33. if(ex==null){
  34. LogUtil.e("第"+i+"个数据批量删除成功");
  35. }else{
  36. LogUtil.e("第"+i+"个数据批量删除失败:"+ex.getMessage()+","+ex.getErrorCode());
  37. }
  38. }
  39. }else{
  40. Log.i("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
  41. }
  42. }
  43. });
  44. }

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

5.8 批量添加、批量更新、批量删除同步提交
  1. /**批量添加、批量更新、批量删除同步提交**/
  2. private void controList(){
  3. LogUtil.e(MainActivity.class,"=======批量添加、批量更新、批量删除=======");
  4. BmobBatch batch =new BmobBatch();
  5. //批量添加
  6. List<BmobObject> persons = new ArrayList<BmobObject>();
  7. Person person = new Person();
  8. person.setNickName("张三 ");
  9. persons.add(person);
  10. batch.insertBatch(persons);
  11. //批量更新
  12. List<BmobObject> persons1=new ArrayList<BmobObject>();
  13. Person p1 = new Person();
  14. p1.setObjectId("ec4886adaa");
  15. p1.setAge(35);
  16. persons1.add(p1);
  17. batch.updateBatch(persons1);
  18. //批量删除
  19. List<BmobObject> persons2 = new ArrayList<BmobObject>();
  20. Person p2 = new Person();
  21. p2.setObjectId("5798716e7f");
  22. persons2.add(p2);
  23. batch.deleteBatch(persons2);
  24. //执行批量操作
  25. batch.doBatch(new QueryListListener<BatchResult>() {
  26. @Override
  27. public void done(List<BatchResult> list, BmobException e) {
  28. if(e==null){
  29. //返回结果的results和上面提交的顺序是一样的,请一一对应
  30. for(int i=0;i<list.size();i++){
  31. BatchResult result= list.get(i);
  32. if(result.isSuccess()){//只有批量添加才返回objectId
  33. LogUtil.e("第"+i+"个成功:"+result.getObjectId()+","+result.getUpdatedAt());
  34. }else{
  35. BmobException error= result.getError();
  36. LogUtil.e("第"+i+"个失败:"+error.getErrorCode()+","+error.getMessage());
  37. }
  38. }
  39. }else{
  40. LogUtil.e("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
  41. }
  42. }
  43. });
  44. }
5.9 单条数据查询
  1. /**单个查询**/
  2. private void checkByObjectId(){
  3. new BmobQuery<Person>().getObject("5798716e7f", new QueryListener<Person>() {
  4. @Override
  5. public void done(Person person, BmobException e) {
  6. if(e==null){
  7. //获得createdAt数据创建时间(注意是:createdAt,不是createAt)
  8. LogUtil.e(MainActivity.class,"======person getNickName="+person.getNickName()+" getObjectId="+person.getObjectId()+" getCreatedAt="+person.getCreatedAt());
  9. }else{
  10. LogUtil.e("bmob","失败:"+e.getMessage()+","+e.getErrorCode());
  11. }
  12. }
  13. });
  14. }
5.10 查询多条数据

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

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

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

六.项目结构图和效果图

项目结构图

运行效果图

Bmob实现android云端存储

代码地址如下:
http://www.demodashi.com/demo/12547.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

Bmob实现android云端存储的更多相关文章

  1. 【Android开发日记】之入门篇(七)——Android数据存储(上)

    在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...

  2. 【Android开发日记】之入门篇(八)——Android数据存储(下)

    废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...

  3. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  4. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  5. Android数据存储之GreenDao 3.0 详解

    前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...

  6. Android SharedPreferences存储

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/Android_SharedPreferences.html 一 概念 SharedPreferen ...

  7. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  8. Android 媒体存储服务(二)

    Android 媒体存储服务 简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套 ...

  9. Android 媒体存储服务(一)

    Android 媒体存储服务 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 ...

随机推荐

  1. 6.DataFrame(列运算)

    from odps import ODPS from odps.df import DataFrame o = ODPS(access_id="LTAIBb3aOF3ghjek", ...

  2. mysql 主从手动切换

    将主从(3307主--3308从)切换 前提:3307正常 一.将3307设为只读.命令行操作 # 修改配置文件 vim /etc/mysql/mysql-//my.cnf # 在[mysqld]中增 ...

  3. easyui常用

    清空列表选中项 //easyui datagrid 清空勾选 $('#List').datagrid('clearSelections'); 扩展修改查询方法 function QueryList() ...

  4. 洛谷 P1506 拯救oibh总部【DFS/Flood Fill】

    题目背景 oibh总部突然被水淹没了!现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去 ...

  5. Activator常用方法

    1.获取图片 public static Image getImage(String key) {        Image img = getDefault().getImageRegistry() ...

  6. Android开发之onCreate

    最近看了一些开发人员做的APP开发,虽然都实现了比较完美的功能,不过很多地方很是牵强!我觉得:作为一个合格软件工程师,最重要的不是你写过多少代码,而是你研究过多少代码!所以,我更倡导多研究系统原本定制 ...

  7. Spring Boot中使用Feign调用时Hystrix提示异常:"could not be queued for execution and no fallback available."以及"Rejected command because thread-pool queueSize is at rejection threshold"

    说明: 1.我还没有真正理解Spring Cloud的精髓,现只停留在使用阶段,可能存在分析不到位的问题. 1.这个是由于线程池的最大数量导致的,官方说随着线程池的数量越大,资源开销也就越大,所以调整 ...

  8. 【Linux】CentOS7上安装JDK 和卸载 JDK 【rpm命令的使用】

    之前有过一篇在CentOS7上安装JDK的文章:http://www.cnblogs.com/sxdcgaq8080/p/7492426.html 在这里又说一次,是要使用rpm命令安装JDK的rpm ...

  9. ios学习流水账2

    1.UISearchBar自定义背景.取消按钮中文设置 UISearchBar *seachBar=[[UISearchBar alloc] init]; //修改搜索框背景 seachBar.bac ...

  10. 单元测试方法属性(Unit Test Method Attribute)

    Additional test attributes(可以在测试方法上使用的属性)As you have seen, the unit-testing subsystem within Visual ...