在网址栏输入www.bmob.cn或者在百度输入Bmob进行搜索,打开Bmob官网后,点击右上角的“注册”,在跳转页面填入你的姓名、邮箱、设置密码,确认后到你的邮箱激活Bmob账户,你就可以用Bmob轻松开发应用了。
登录账号进入bmob后台后,点击后台界面左上角“创建应用”,在弹出框输入你应用的名称,然后确认,你就拥有了一个等待开发的应用。
选择你要开发的应用,点击该应用下方对应的“应用密钥”
在跳转页面,获取Application ID,此ID将会在初始化SDK中使用到。
获取Application ID后,下载SDK,开发者可以根据自己的需求选择相应的iOS SDK 或Android SDK,点击下载即可。
一、在你的项目根目录下创建"libs"目录,将下载的BmobSDK文件放入该目录下。
二、在你的应用程序中添加相应的权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_LOGS"/>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.bmob.example" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_LOGS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name="cn.bmob.example.MainActivity" android:screenOrientation="portrait" android:label="@string/app_name"> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <activity android:name=".CreateActivity" android:screenOrientation="portrait"> <activity android:name=".DeleteActivity" android:screenOrientation="portrait"> <activity android:name=".UpdateActivity" android:screenOrientation="portrait"> <activity android:name=".FindActivity" android:screenOrientation="portrait"> </application> </manifest>
在你应用程序启动的Activity的onCreate()方法中初始化Bmob功能。代码如下所示:
package com.bmob.example; import cn.bmob.Bmob; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // 初始化 Bmob SDK // 使用时请将第二个参数Application ID替换成你在Bmob服务器端创建的Application ID Bmob.initialize(this, "Your Application ID"); } }
Bmob平台为您的移动应用提供了一个完整的后端解决方案,我们提供轻量级的SDK开发包,让开发者以最小的配置和最简单的方式使用Bmob平台提供的服务,进而完全消除开发者编写服务器代码以及维护服务器的操作。
Bmob致力于为开发者提供快速开发服务,为方便大家更好的理解Bmob SDK能够做的事情,我们特意为大家提供了一些源码,大家可以下载之后,嵌入Bmob的AppKey,再打包运行。
阅读源码是一种良好的习惯!!
即时聊天案例源码:https://github.com/bmob/BmobIMSDK4Android
图文社区案例源码:https://github.com/bmob/Wonderful2 这个案例是猿圈媛圈开发团队提供的。
校园小菜案例源码:https://github.com/bmob/Shop 这个案例是湖工大的朋友提供的。
社交分享案例源码:https://github.com/bmob/bmob-android-social-share 这个是金刚锁开发者提供的
第三方登录案例源码:https://github.com/bmob/bmob-android-demo-thirdpartylogin 包含第三方登录和登录后获取用户信息的源码
在Bmob平台注册后,每个账户可创建多个应用程序,创建的每个应用程序都有其独自的应用程序ID,此后所有的应用程序将凭其ID进行Bmob SDK的使用。即使只有一个应用程序,也可以以不同的版本进行测试和生产。
请大家在使用Bmob开发应用程序之前,认真阅读我们给大家提供的“数据与安全”的文档,确保你的应用在发布时安全。文档的链接地址是:http://docs.bmob.cn/datasafety/index.html?menukey=otherdoc&key=datasafety
目前为止,我们支持的数据类型有String、Integer、Boolean、ArrayList以及BmobObject对象类型。同时Bmob也支持BmobDate、BmobGeoPoint、 BmobFile数据类型。
一个对象对应了数据表中的一条数据,也可以理解为应用程序中的JavaBean.
Bmob存储的数据是建立在BmobObject基础上的,所以任何要保存的数据对象必须继承自BmobObject类。BmobObject对象包含objectId、createdAt、updatedAt、ACL四个默认的属性,objectId为对象的唯一标示,可以理解为数据表中的主键,createdAt为对象的创建时间,updatedAt为对象的最后修改时间,ACL为这条数据的操作权限控制。例如,游戏中可能会用到的分数对象GameScore,它可能包含score、playerName、cheatMode等属性,那么这个数据对象创建的示例代码如下:
public class GameScore extends BmobObject{ private String playerName; private Integer score; private Boolean cheatMode; private BmobFile pic; public String getPlayerName() { return playerName; } public void setPlayerName(String playerName) { this.playerName = playerName; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public Boolean getCheatMode() { return cheatMode; } public void setCheatMode(Boolean cheatMode) { this.cheatMode = cheatMode; } public BmobFile getPic() { return pic; } public void setPic(BmobFile pic) { this.pic = pic; } }
//这时候实际操作的表是T_a_b public class GameScore extends BmobObject{ private String playerName; private Integer score; private Boolean cheatMode; private BmobFile pic; public GameScore() { this.setTableName("T_a_b"); } public String getPlayerName() { return playerName; } //其他方法,见上面的代码 }
当然了,你也可以在GameScore实例中动态调用setTableName方法,实现操作可变表(如根据日期建立表来存储信息)的可能。
如果您使用了setTableName方法来自定义表名,那么在对该表进行数据查询的时候必须使用以下方法来进行查询。需要注意的是查询的结果是一个JSONArray,您需要自行解析JSONArray中的数据来进行使用。
/** * 查询数据 */ public void queryData(){ BmobQuery query = new BmobQuery("T_a_b"); query.findObjects(this, new FindCallback() { @Override public void onSuccess(JSONArray arg0) { // TODO Auto-generated method stub showToast("查询成功:"+arg0.length()); } @Override public void onFailure(int arg0, String arg1) { // TODO Auto-generated method stub showToast("查询失败:"+arg1); } }); }
自定义表名情况下的更新、删除数据和普通的更新、删除数据方式一样,没有变化。尽管如此,我们还是提供了一个关于自定义表名情况下增删改查数据的Demo供开发者朋友参照源码来学习,下载地址是:https://github.com/bmob/bmob-android-demo-dynamic-tablename。
为了提供更好的服务,BmobSDK中提供了BmobUser、BmobInstallation两个特殊的BmobObject对象来完成不同的功能,在这里我们统一称为特殊对象。 BmobUser对象主要是针对应用中的用户功能而提供的,它对应着web端的User表,使用BmobUser对象可以很方便的在应用中实现用户的注册、登录、邮箱验证等功能,具体的使用方法可查看文档的用户
部分。 BmobInstallation对象主要用于应用的安装设备管理中,它对应着web端的Installation表,任何安装了你应用的设备都会在此表中产生一条数据标示该设备。结合Bmob提供的推送功能,还可以实现将自定义的消息推送给不同的设备终端,具体的使用方法可查看文档的消息推送
部分。
添加数据非常简单,任何BmobObject对象都具有save
方法可以用于将当前对象的内容保存到服务端。 例如,你现在要保存一条游戏分数的记录,可以这样做:
GameScore gameScore = new GameScore(); gameScore.setPlayerName("Barbie"); gameScore.setScore(89); gameScore.setCheatMode(false); gameScore.save(mContext, new SaveListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("添加数据成功,返回objectId为:"+gameScore.getObjectId()); } @Override public void onFailure(int code, String arg0) { // TODO Auto-generated method stub // 添加失败 } });
运行完以上代码后,数据即可保存到服务器端。为了确认数据是否真的已经保存成功,你可以在Bmob服务器端你应用程序的数据浏览项目中进行查看。你应该看到类似这样的结果:
objectId: "0c6db13c", score: 89, playerName: "Barbie", cheatMode: false,createdAt:"2013-09-27 10:32:54", updatedAt:"2013-09-27 10:32:54"
注:
在运行以上代码时,如果服务器端你创建的应用程序中已经存在GameScore数据表和相应的score、playerName、cheatMode字段,那么你此时添加的数据和数据类型也应该和服务器端的表结构一致,否则将保存数据失败。
如果服务器端不存在GameScore数据表,那么Bmob将根据你第一次(也就是运行的以上代码)保存的GameSocre对象在服务器为你创建此数据表并插入相应数据。
每个BmobObject对象都有几个默认的键(数据列)是不需要开发者指定的,objectId
是每个保存成功数据的唯一标识符。createdAt
和updatedAt
代表每个对象(每条数据)在服务器上创建和最后修改的时间。这些键(数据列)的创建和数据内容是由服务器端自主来完成的。因此,使用save和insert方法时,不需要调用setObjectId方法,否则会出现提示:“It is a reserved field: objectId(105)”--表明objectId为系统保留字段,不允许修改。
。
数据的查询可能是每个应用都会频繁使用到的,BmobSDK中提供了BmobQuery类,它提供了多样的方法来实现不同条件的查询,同时它的使用也是非常的简单和方便的。
查询某个数据表中的所有数据是非常简单的查询操作,例如:查询所有人员的信息。
BmobQuery<GameScore> query = new BmobQuery<GameScore>(); query.findObjects(this, new FindListener<GameScore>() { @Override public void onSuccess(List<GameScore> object) { // TODO Auto-generated method stub toast("查询成功:共"+object.size()+"条数据。"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查询失败:"+msg); } });
怎么样,是不是很简单,而且查询的结果不需要进行任何处理,BmobSDK已经为你封装成相应的JavaBean集合了,你直接使用即可。
这里需要注意一点的是: 默认情况下,系统实际上并不会返回所有的数据,而是默认返回10条数据记录,你可以通过setLimit方法设置返回的记录数量。更多细节可点击查看分页查询一节。
当我们知道某条数据的objectId时,就可以根据objectId直接获取单条数据对象。例如:查询objectId为a203eba875
的人员信息。
BmobQuery<GameScore> query = new BmobQuery<GameScore>(); query.getObject(this, "a203eba875", new GetListener<GameScore>() { @Override public void onSuccess(GameScore object) { // TODO Auto-generated method stub toast("查询成功:"); } @Override public void onFailure(int code, String arg0) { // TODO Auto-generated method stub toast("查询失败:"+arg0); } });
在查询的使用过程中,基于不同条件的查询是非常常见的,BmobQuery同样也支持不同条件的查询。
例如:如果要过滤掉特定键的值可以使用addWhereNotEqualTo
方法。比如需要查询playerName不等于“Barbie”的数据时可以这样写:
query.addWhereNotEqualTo("playerName", "Barbie");
当然,你可以在你的查询操作中添加多个约束条件,来查询符合要求的数据。
query.addWhereNotEqualTo("playerName", "Barbie"); //名字不等于Barbie query.addWhereGreaterThan("score", 60); //条件:分数大于60岁
各种不同条件的比较查询:
// 分数 < 50 query.addWhereLessThan("score", 50); //分数 <= 50 query.addWhereLessThanOrEqualTo("score", 50); //分数 > 50 query.addWhereGreaterThan("score", 50); //分数 >= 50 query.addWhereGreaterThanOrEqualTo("score", 50);
如果你想查询匹配几个不同值的数据,如:要查询“Barbie”,“Joe”,“Julia”三个人的成绩时,你可以使用addWhereContainedIn
方法来实现。
String[] names = {"Barbie", "Joe", "Julia"}; query.addWhereContainedIn("playerName", Arrays.asList(names));
相反,如果你想查询排除“Barbie”,“Joe”,“Julia”这三个人的其他同学的信息,你可以使用addWhereNotContainedIn
方法来实现。
String[] names = {"Barbie", "Joe", "Julia"}; query.addWhereNotContainedIn("playerName", Arrays.asList(names));
注:时间查询
比较特殊,我们需要结合BmobDate这个类来查询某个指定日期时间前后的数据,这里也给出示例供大家参考:
比如,你想查询2015年2月11号之前的Person数据,那么可以使用addWhereLessThan或者addWhereLessThanOrEqualTo(包含当天)来查询。如果想查询之后的数据,则可以使用addWhereGreaterThan或addWhereGreaterThanOrEqualTo(包含当天)来查询。
BmobQuery<Person> query = new BmobQuery<Person>("Person"); String dateString = "2015-02-11"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = sdf.parse(dateString); } catch (ParseException e) { e.printStackTrace(); } //这是查询2015年2月11之前的Person数据 query.addWhereLessThan("createdAt",new BmobDate(date)); //这是查询2015年2月11之后的Person数据 //query.addWhereGreaterThan("createdAt",new BmobDate(date)); ```java ### 模糊查询 如果你想实现类似数据库的模糊查询,比如,你想查询用户表中用户名中含有“a”的用户,那么你可以使用`addWhereContains`方法来实现。 ```java String value = "a"; query.addWhereContains("username", value);
有时,在数据比较多的情况下,你希望查询出的符合要求的所有数据能按照多少条为一页来显示,这时可以使用setLimit
方法来限制查询结果的数据条数来进行分页。默认情况下,Limit的值为10,最大有效设置值1000(设置的数值超过1000还是视为1000)。
query.setLimit(10); // 限制最多10条数据结果作为一页
在数据较多的情况下,在setLimit
的基础上分页显示数据是比较合理的解决办法,setSKip
方法可以做到跳过查询的前多少条数据来实现分页查询的功能。默认情况下Skip的值为10。
query.setSkip(10); // 忽略前10条数据(即第一页数据结果)
大家也可以直接下载我们提供的Demo源码(https://github.com/bmob/bmob-android-demo-paging),查看如何使用分页查询,结合ListView开发下拉刷新查看更多内容的应用。
对应数据的排序,如数字或字符串,你可以使用升序或降序的方式来控制查询数据的结果顺序:
// 根据score字段升序显示数据 query.order("score"); // 根据score字段降序显示数据 query.order("-score"); // 多个排序字段可以用(,)号分隔 query.order("-score,createdAt");
说明:多个字段排序时,先按第一个字段进行排序,再按第二个字段进行排序,依次进行。
如果你只是想统计满足查询对象的数量,你并不需要获取所有匹配对象的具体数据信息,可以直接使用count
替代findObjects
。例如,查询一个特定玩家玩的游戏场数:
BmobQuery<GameSauce> query = new BmobQuery<GameSauce>(); query.addWhereEqualTo("playerName", "Barbie"); query.count(this, GameSauce.class, new CountListener() { @Override public void onSuccess(int count) { // TODO Auto-generated method stub toast("Barbie has played" + count + "games"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("count failure:"+msg); } });
有些查询需要使用到复合“与”的查询条件,例如:你想查询出Person表中年龄在6-29岁之间且姓名以"y"或者"e"结尾的人,那么,可以采用and查询,示例代码如下:
//查询年龄6-29岁之间的人,每一个查询条件都需要New一个BmobQuery对象 //--and条件1 BmobQuery<Person> eq1 = new BmobQuery<Person>(); eq1.addWhereLessThanOrEqualTo("age", 29);//年龄<=29 //--and条件2 BmobQuery<Person> eq2 = new BmobQuery<Person>(); eq2.addWhereGreaterThanOrEqualTo("age", 6);//年龄>=6 //查询姓名以"y"或者"e"结尾的人--这个需要使用到复合或查询(or) //--and条件3 BmobQuery<Person> eq3 = new BmobQuery<Person>(); eq3.addWhereEndsWith("name", "y"); BmobQuery<Person> eq4 = new BmobQuery<Person>(); eq4.addWhereEndsWith("name", "e"); List<BmobQuery<Person>> queries = new ArrayList<BmobQuery<Person>>(); queries.add(eq3); queries.add(eq4); BmobQuery<Person> mainQuery = new BmobQuery<Person>(); BmobQuery<Person> or = mainQuery.or(queries); //最后组装完整的and条件 List<BmobQuery<Person>> andQuerys = new ArrayList<BmobQuery<Person>>(); andQuerys.add(eq1); andQuerys.add(eq1); andQuerys.add(or); //查询符合整个and条件的人 BmobQuery<Person> query = new BmobQuery<Person>(); query.and(andQuerys); query.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person