代码地址如下:
http://www.demodashi.com/demo/12547.html
前言
一直很困惑,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云端存储
代码地址如下:
http://www.demodashi.com/demo/12547.html
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
来源:https://www.cnblogs.com/demodashi/p/8512854.html