Bmob 开发Android程序快速入门--小demo
注册Bmob帐号
在网址栏输入www.bmob.cn或者在百度输入Bmob进行搜索,打开Bmob官网后,点击右上角的“注册”,在跳转页面填入你的姓名、邮箱、设置密码,确认后到你的邮箱激活Bmob账户,你就可以用Bmob轻松开发应用了。
网站后台创建应用
登录账号进入bmob后台后,点击后台界面左上角“创建应用”,在弹出框输入你应用的名称,然后确认,你就拥有了一个等待开发的应用。
获取应用密钥和下载SDK
选择你要开发的应用,点击该应用下方对应的“应用密钥”
在跳转页面,获取Application ID,此ID将会在初始化SDK中使用到。
获取Application ID后,下载SDK,开发者可以根据自己的需求选择相应的iOS SDK 或Android SDK,点击下载即可。
安装BmobSDK
一、在你的项目根目录下创建"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>
初始化BmobSDK
在你应用程序启动的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;
}
}
类名和表名的关系
- 默认情况下,Bmob提供了类名和表名完全一致的简单方式,实现类名和表名的映射。如,上面的GameScore类对应Web后台的表名是GameScore(区分大小写),如果创建一个数据对象名称为T_a_b,那么这个类名对应的Web后台的表名也是T_a_b。
- 但很多时候,你希望在后台创建的表名和类名并不相同,如表名为T_a_b,而类名还是GameScore,那么你可以使用BmobObject提供的setTableName("表名")的方法,示例代码如下:
//这时候实际操作的表是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);
}
});
复杂查询
复合与查询(and)
有些查询需要使用到复合“与”的查询条件,例如:你想查询出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