前言:《Bmob》是一个可以开发云存储的移动应用软件,给应用软件快速添加一个安全灵活的后台管理系统,方便浏览终端保存的各种信息。针对移动应用开发的特性,Bmob还提供了主动推送服务.
可以让移动开发者将信息从服务器直接推送到应用程序中,从而实现软件的主动更新、信息通知等服务

1、首先注册Bmob账号,地址:https://www.bmob.cn/register

不想注册可使用APP ID:4dacb15a8bcea4f9dd2f78cb9b544f89 作为测试使用

①:注册成功后进入我的控制台>>左上角创建应用如下图:


关于版本的收费情况以及功能介绍:https://www.bmob.cn/prices

②、创建应用后点开该应用,找到左边设置按钮查看对应的应用信息

2、找到主工程的build.gradle添加Bmob的依赖,如下图所示:

①:

maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }

②:回到app的build.gradle中:

android {useLibrary 'org.apache.http.legacy'
}dependencies {implementation 'cn.bmob.android:bmob-sdk:3.7.3-rc1'implementation "io.reactivex.rxjava2:rxjava:2.2.2"implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'implementation 'com.squareup.okio:okio:2.1.0'implementation 'com.google.code.gson:gson:2.8.5'implementation 'com.squareup.okhttp3:okhttp:3.12.0'implementation 'cn.bmob.android:http-legacy:1.0'
}

注意:useLibrary 'org.apache.http.legacy’和implementation ‘cn.bmob.android:http-legacy:1.0’
两者任选其一

③:AndroidManifest.xml清单文件中添加权限:

<!--允许联网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--获取GSM(2g)、WCDMA(联通3g)等网络状态的信息  -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--获取wifi网络状态的信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--保持CPU 运转,屏幕和键盘灯有可能是关闭的,用于文件上传和下载 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--获取sd卡写的权限,用于文件上传和下载-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许读取手机状态 用于创建BmobInstallation-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

④:配置ContentProvider

     <application>
···
<providerandroid:name="cn.bmob.v3.util.BmobContentProvider"android:authorities="你的应用包名.BmobContentProvider">
</provider>
···
</application>

⑤:注册MyApplication代码如下:

public class MyApplication extends Application {private static final String TAG = "MyApplication";@Overridepublic void onCreate() {super.onCreate();//初始化Bmob后端//自v3.4.7版本开始,设置BmobConfig,允许设置请求超时时间、文件分片上传时每片的大小、文件的过期时间(单位为秒),BmobConfig config = new BmobConfig.Builder(this).setApplicationId("4dacb15a8bcea4f9dd2f78cb9b544f89")//设置appkey.setConnectTimeout(15)//请求超时时间(单位为秒):默认15s.setUploadBlockSize(1024 * 1024)//文件分片上传时每片的大小(单位字节),默认512*1024.setFileExpiration(2500)//文件的过期时间(单位为秒):默认1800s.build();Bmob.initialize(config);//TODO 初始化Bmob推送服务(不需要注释以下代码)BmobInstallationManager.getInstance().initialize(new InstallationListener<BmobInstallation>() {@Overridepublic void done(BmobInstallation bmobInstallation, BmobException e) {if (e == null) {Log.e(TAG, "推送成功ID:" + bmobInstallation.getObjectId()+ "-" + bmobInstallation.getInstallationId());} else {//LogUtils.e("推送失败信息:" + e.getMessage());Log.e(TAG, "推送失败信息:" + e.getMessage());}}});// 启动推送服务BmobPush.startWork(this);}
}

最后在AndroidManifest的application 添加 android:name=".MyApplication"
如果需要推送服务添加如下代码:

    implementation 'cn.bmob.android:bmob-push:1.0.3'

3、代码部分:创建地址实体类AddressManagerDto

public class AddressManagerDto extends BmobObject implements Serializable {//收货人private String consignee;//手机号码private String phoneNumber;//省private String province;//市private String city;//区private String area;//省市区private String provinces;//详细地址private String detailedAddress;//是否是默认地址private boolean isDefault;//唯一标识不可重复private String uuid;//所属账户private String account;public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getUuid() {return uuid;}public void setUuid(String uuid) {this.uuid = uuid;}public String getConsignee() {return consignee;}public void setConsignee(String consignee) {this.consignee = consignee;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getArea() {return area;}public void setArea(String area) {this.area = area;}public String getProvinces() {return provinces;}public void setProvinces(String provinces) {this.provinces = provinces;}public String getDetailedAddress() {return detailedAddress;}public void setDetailedAddress(String detailedAddress) {this.detailedAddress = detailedAddress;}public boolean isDefault() {return isDefault;}public void setDefault(boolean aDefault) {isDefault = aDefault;}
}

①:新增

 private void addTheAddress() {AddressManagerDto managerDto = new AddressManagerDto();managerDto.setConsignee("张三");managerDto.setPhoneNumber("18888888888");managerDto.setProvinces("江西省南昌市青云谱区");managerDto.setDetailedAddress("罗湖街道110号");managerDto.setDefault(true);//是默认地址managerDto.setUuid(UUID.randomUUID().toString());//唯一标识(https://blog.csdn.net/yxiaom/article/details/17117519)managerDto.setAccount("李四");managerDto.save(new SaveListener<String>() {@Overridepublic void done(String objectId, BmobException e) {//错误为null标识保存成功if (null != e) {//保存成功} else {//保存失败//e.getErrorCode();e.getMessage();}}});}

新增成功后如下图:

系统默认生成字段 createdAt 创建时间和 updatedAt 更新时间 以及objectID

②:查询

private void queryAddress() {BmobQuery<AddressManagerDto> query = new BmobQuery<>();//1、比较查询//【等于】(例:查询收货人为张三的)query.addWhereEqualTo("consignee", "张三");//【不等于】(例:查询收货人不为张三的)query.addWhereNotEqualTo("consignee", getPhone());//【小于】query.addWhereLessThan("查询字段", "值");//【小于等于】query.addWhereLessThanOrEqualTo("查询字段", "值");//【大于】query.addWhereGreaterThan("查询字段", "值");//【大于等于】query.addWhereGreaterThanOrEqualTo("查询字段", "值");//2、子查询 (例:查询收货人为张三、李四、王五)String[] names = {"张三", "李四", "王五"};query.addWhereContainedIn("consignee", Arrays.asList(names));//相反的(例:排除收货人为张三、李四、王五)query.addWhereNotContainedIn("consignee", Arrays.asList(names));//3、时间查询(同比较查询一致)String createdAt = "2019-11-23 10:30:00";query.addWhereEqualTo("createdAt", createdAt);//时间等于query.addWhereNotEqualTo("createdAt", createdAt);//时间外//query.addWhereLessThan("createdAt", createdAt);//时间前//query.addWhereLessThanOrEqualTo("createdAt", createdAt);//时间及以前//query.addWhereGreaterThan("createdAt", createdAt);//时间后//query.addWhereGreaterThanOrEqualTo("createdAt", createdAt);//时间及以后//4、数组查询 【包含所有 例:查询A、B、C用户】String[] alias = new String[]{"A", "B", "C"};query.addWhereContainsAll("consignee", Arrays.asList(alias));//5、模糊查询【正则表达式来检索相匹配的值】query.addWhereMatches("consignee", "^[A-Z]\\d");//查询consignee字段的值含有“张”的数据query.addWhereContains("consignee", "张");//查询consignee字段的值是以“张“字开头的数据query.addWhereStartsWith("consignee", "张");// 查询consignee字段的值是以“三“字结尾的数据query.addWhereEndsWith("consignee", "三");//分页查询【Limit的值为100,最大有效设置值500(设置的数值超过500还是视为500)】query.setLimit(20);query.setSkip(20);//忽略前20条数据(即第一页数据结果)// 根据score字段升序显示数据query.order("score");// 根据score字段降序显示数据query.order("-score");//多个排序字段可以用(,)号分隔query.order("-score,createdAt");//createdAt默认生成//说明:多个字段排序时,先按第一个字段进行排序,再按第二个字段进行排序,依次进行。query.findObjects(new FindListener<AddressManagerDto>() {@Overridepublic void done(List<AddressManagerDto> list, BmobException e) {if (null == e) {//查询成功} else {//查询失败}}});}

③:修改

private void updateAddress() {//1、更新对象AddressManagerDto managerDto = new AddressManagerDto();managerDto.setConsignee("李四");managerDto.setPhoneNumber("16666666666");managerDto.setProvinces("北京市东城区");managerDto.setDetailedAddress("三里屯鹿角大道");//2更新数组//更新String类型数组中的值managerDto.setValue("张三", "李四");//将张三中第一个位置的修改为李四//更新Object类型数组中的某个位置的对象值(0对应集合中第一个元素)//p2.setValue("张三", new AddressManagerDto("张三", "李四"));//将地址中第一个位置修改为指定AddressManagerDto对象//更新Object类型数组中指定对象的指定字段的值//p2.setValue("AddressManagerDto.0.consignee", "王五");//将AddressManagerDto中第一个位置的银行卡名称修改为王五//p2.setValue("AddressManagerDto.1.consignee", "王五");//将AddressManagerDto中第二个位置的银行卡账号修改为王五//例如:在列表中可通过【list.get(position).getObjectID()来获取】managerDto.update("更新的objectId", new UpdateListener() {@Overridepublic void done(BmobException e) {if (e == null) {//更新成功} else {//更新失败}}});}

④:删除

 private void deleteAddress(final int position) {String objectId = list.get(position).getObjectId();//1、删除对象AddressManagerDto managerDto = new AddressManagerDto();//2、删除数组managerDto.removeAll("consignee", Arrays.asList("张三","李四","王五"));//例:list.get(position).getObjectId()managerDto.delete(objectId, new UpdateListener() {@Overridepublic void done(BmobException e) {if (e == null) {//删除成功} else {//删除失败}}});}

⑤:上传文件需要域名,19年7月份之前是不用的,找到应用设置的域名管理,如下图所示:


注意:一定需要【国内的】已经【备案】的域名,香港、国外的都不行

1、上传文件代码,以图片为例:

    /*** 上传图片单张* path:图片的路径*/private void uploadImgPath(String path) {final BmobFile file = new BmobFile(new File(path));file.uploadblock(new UploadFileListener() {@Overridepublic void done(BmobException e) {if (null == e) {//上传成功} else {//上传失败}}@Overridepublic void onProgress(Integer value) {super.onProgress(value);//上传进度}});}
    /*** 多张图片上传*/private void uploadImgPath() {//本地图片路径String path1 = "test1.png";String path2 = "test2.png";String path3 = "test3.png";String[] filePaths = new String[3];filePaths[0] = path1;filePaths[1] = path2;filePaths[2] = path3;BmobFile.uploadBatch(filePaths, new UploadBatchListener() {@Overridepublic void onSuccess(List<BmobFile> files, List<String> urls) {//1、files-上传完成后的BmobFile集合,是为了方便大家对其上传后的数据进行操作,例如你可以将该文件保存到表中//2、urls-上传文件的完整url地址if (urls.size() == filePaths.length) {//如果数量相等,则代表文件全部上传完成}}@Overridepublic void onError(int statuscode, String errormsg) {//"错误码" + statuscode + ",错误描述:" + errormsg}@Overridepublic void onProgress(int curIndex, int curPercent, int total, int totalPercent) {//1、curIndex--表示当前第几个文件正在上传//2、curPercent--表示当前上传文件的进度值(百分比)//3、total--表示总的上传文件数//4、totalPercent--表示总的上传进度(百分比)}});}

2、推送部分,在AndroidManifest.xml清单文件中配置如下代码:

 <providerandroid:name="cn.bmob.v3.util.BmobContentProvider"android:authorities="你的应用包名.BmobContentProvider" /> <!-- TODO 集成:1.2、添加推送所需要的服务和广播 --><serviceandroid:name="cn.bmob.push.lib.service.PushService"android:exported="true"android:label="PushService"android:process=":bmobpush"><intent-filter><action android:name="cn.bmob.push.lib.service.PushService" /></intent-filter></service> <!-- 用于进程保活 --><serviceandroid:name="cn.bmob.push.lib.service.PushNotifyService"android:process=":bmobpush" /><receiver android:name="cn.bmob.push.PushReceiver"><intent-filter><!-- 系统启动完成后会调用 --><action android:name="android.intent.action.BOOT_COMPLETED" /><!-- 解锁完成后会调用 --><action android:name="android.intent.action.USER_PRESENT" /><!-- 监听网络连通性 --><action android:name="android.net.conn.CONNECTIVITY_CHANGE" /></intent-filter></receiver> <!-- 第3步中创建的消息接收器,在这里进行注册 --><receiver android:name=".MyPushMessageReceiver"><intent-filter><action android:name="cn.bmob.push.action.MESSAGE" /></intent-filter></receiver> <!-- 接收心跳和唤醒的广播,要和PushService运行在同个进程 --><receiverandroid:name="cn.bmob.push.PushNotifyReceiver"android:process=":bmobpush"><intent-filter><!-- 接收心跳广播的action --><action android:name="cn.bmob.push.action.HEARTBEAT" /><!-- 接收唤醒广播的action --><action android:name="cn.bmob.push.action.NOTIFY" /></intent-filter></receiver>

新建MyPushMessageReceiver类:

public class MyPushMessageReceiver extends BroadcastReceiver {private static final String TAG = "MyPushMessageReceiver";@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {String notic = intent.getStringExtra("msg");try {JSONObject object = new JSONObject(notic);String str = object.getString("alert");Log.e(TAG, "onReceive: " + str);} catch (JSONException e) {e.printStackTrace();}}}
}

回到Bmob控制台:


状态码链接:http://doc.bmob.cn/other/error_code/
官方文档:http://doc.bmob.cn/

安卓Bmob后端云的使用(增删改查、上传图片、推送服务等)相关推荐

  1. 安卓的SMS 短信的增删改查

    这是安卓学习之旅1--- 关于安卓的SMS 短信的增删改查 首先我们要知道是的是我们用的是 ContentResolver cr = getContentResolver(); 这个是内容提供者. c ...

  2. springboot/vue前后端分离后台管理系统增删改查

    1.需求分析 一个音乐管理系统包括: 1.用户信息管理:该模块主要由管理员进行操作,将所有用户的用户名.密码.邮箱.创建时间以及用户状态列在一张表,管理员可以进行增加.删除(批量删除).修改以及查询用 ...

  3. 【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

    目录 前言 一.准备工作 1.1.下载MyBatis 1.2.数据库设计 二.搭建框架 2.1.创建Maven项目 2.2.jar包.引入依赖 2.3.创建MyBatis核心配置文件 2.4.映射文件 ...

  4. app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)

    在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...

  5. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)

    [微信小程序系列]微信小程序超简单教程 小程序项目结构 静态页面的构成 HTML:结构 css:样式 js:行为 小程序 页面全部存放在pages, 而且pages目录只能存放页面 页面包括4个文件, ...

  6. 【微信小程序】云数据库交互-增删改查

    小程序的云开发模式,有提供一个云数据库,实际上不能算一个数据库,只能算是doc存储.里面创建的不是表,而是集合,所以,也称为云集合开发模式. 云数据库 官方文档 https://developers. ...

  7. 微信小程序云开发—数据库增删改查

    首先新建小程序项目,后端服务选择"小程序云开发",新建项目成功后,开通云开发,在app.js中添加 wx.cloud.init({traceUser: true,}) 如下图所示, ...

  8. php增删改查前后端分离,前后端分离之前端增删改查

    初次接触前后端分离,现把前端一个例子放出来记录以下,不喜勿喷. html静态页面代码: 菜单管理平台数据... 菜单管理查询条件列表 菜单名称: 菜单父级: 菜单名称: 菜单级别: 菜单父级: 图片地 ...

  9. 小程序数据框有重影_微信小程序云开发数据库增删改查

    1.添加数据 onLoad: function (options) { this.adddemo(); }, adddemo:function() { const db = wx.cloud.data ...

最新文章

  1. 伍六七带你学算法 进阶篇-生命游戏
  2. Android应用签名详解 Eclipse+ADT
  3. java pdf 中文_java-pdf-itext 生成pdf 文档(支持中文字体)
  4. 马斯克39也火星计划PPT
  5. 公司 表名规则 TN基础表 TR关系表 TL定义表
  6. Dapper基础知识一
  7. python 类-Python 类class定义 方法与属性教程
  8. NTP时间服务器搭建
  9. C 与 C 的真正区别在哪里?
  10. java中一个对象占多少字节
  11. Zegraph遇到的一个崩溃的问题
  12. RF-实现接口自动化
  13. cdr CorelDRAW Graphics Suite 2021 (v23.1.0)
  14. 形象解释清了内存颗粒、单双面、主板布线和双通道的那些事儿
  15. protoc-gen-go 安装
  16. 補一篇用 Genero BDL 寫 hello world
  17. linux-vimdiff,diff,patch,cmp:文件比较
  18. MFC如何调用Flash控件
  19. 大小写转化php,怎样用PHP做出人名币大小写的方法转换
  20. win10下如何查看自己的显卡型号

热门文章

  1. 【CA-TA实战系列九】安全驱动OP-TEE(华为tzdriver)
  2. 【2022 CCF BDCI 文心大模型创意项目】DIY绘本
  3. 当春天泛滥的时候----李春天的春天的影评
  4. 如何安装VCC++6.0并创建第一个项目
  5. 使用Zeppelin时出现sh interpreter not found错误的解决办法(图文详解)
  6. 基于51单片机的温度湿度采集系统
  7. C语言实现函数确定最大最小值
  8. C# 中使用TCP连接设置超时问题
  9. 计算机毕业设计SSM大学生社团管理系统【附源码数据库】
  10. 匀思电商:抖音短视频四大主流变现方式,你都知道哪些?