提前说明,本文档主要是根据bmob的官网文档进行修改而来,如果可以,大家最好直接去看官网文档
http://docs.bmob.cn/android/faststart/index.html?menukey=fast_start&key=start_android
1·注册www.bmob.com
2创建应用
3获取秘钥下载sdk(http://www.bmob.cn/downloads#android_sdk)
4导入sdk
两种方式:
一种是将我们下载的sdk放到lib目录下面//详细步骤
忽略,如果需要去官网查看
一种是在gradle中进行配置,
推荐使用
1)
在
Project
的
build.gradle
文件中添加
Bmob的maven仓库地址
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
allprojects {
repositories {
jcenter()
//Bmob的maven仓库地址,必须填写
maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
}
}
2)在
app
的
build.gradle
文件中添加
compile依赖文件
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'
defaultConfig {
applicationId "cn.bmob.android"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//以下SDK开发者请根据需要自行选择
//bmob-sdk:Bmob的android sdk包,包含了Bmob的数据存储、文件等服务,以下是最新的bmob-sdk:
//3.4.7-aar:具务必查看下面注释[1]
compile 'cn.bmob.android:bmob-sdk:3.4.7-aar'
//bmob-push:Bmob的推送包
compile 'cn.bmob.android:bmob-push:0.8'
//bmob-im:Bmob的即时通讯包,注意每个版本的im依赖特定版本的bmob-sdk,具体的依赖关系可查看下面注释[3]
compile 'cn.bmob.android:bmob-im:2.0.4'
compile 'cn.bmob.android:androidasync:2.1.6'
compile 'cn.bmob.android:bmob-sdk:3.4.6'
//注:别忘记导入3.4.6的相关依赖包[2]
//bmob-sms :Bmob单独为短信服务提供的包
compile 'cn.bmob.android:bmob-sms:1.0.1'
//如果你想应用能够兼容Android6.0,请添加此依赖(org.apache.http.legacy.jar)
compile 'cn.bmob.android:http-legacy:1.0'
}
5设置权限
<!--允许联网 -->
<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" />
6初始化sdk
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//提供以下两种方式进行初始化操作:
//第一:默认初始化
Bmob.initialize(this, "Your Application ID");
//第二:设置BmobConfig,允许设置请求超时时间、文件分片上传时每片的大小、文件的过期时间(单位为秒),自v3.4.7版本开始
//BmobConfig config =new BmobConfig.Builder(this)
设置appkey
//.setApplicationId("Your Application ID")
请求超时时间(单位为秒):默认15s
//.setConnectTimeout(30)
文件分片上传时每片的大小(单位字节),默认512*1024
//.setUploadBlockSize(1024*1024)
文件的过期时间(单位为秒):默认1800s
//.setFileExpiration(2500)
//.build();
//Bmob.initialize(config);
}
7 添加数据
创建javabean 有自己的getset方法,继承自BmobObject(对应后台的数据表)
public class Person extends BmobObject {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
尽可能的使用Interger,Boolean等包装类,而不是使用基本数据类型
主要原因,我们要传对象而不是基本数据类型
int 放的是基本数据类型,而Interger是一个复杂数据类型,放的是一个引用
初始化 int初始化是0,Interger是null
Interger是int的封装类
泛型的时候我们用的是Interger
然后进行
增 对象.save(this,SaveListener);
删 对象.delete(this,DeleteListener);
改 对象.update(this,id,UpdataListener)
查 对象getObject(this,id,GetListenet<JavaBean>)
数据
//添加数据
Person p2 = new Person();
p2.setName("lucky");
p2.setAddress("北京海淀");
//或者使用这种方式//p2.setValue(Address,"北京海淀");p2.save(this, new SaveListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
toast("添加数据成功,返回objectId为:"+p2.getObjectId());
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
toast("创建数据失败:" + msg);
}
});
//查询数据
//查找Person表里面id为6b6c11c537的数据
BmobQuery<Person> bmobQuery = new BmobQuery<Person>();
bmobQuery.getObject(this, "6b6c11c537", new GetListener<Person>() {
@Override
public void onSuccess(Person object) {
// TODO Auto-generated method stub
toast("查询成功");
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
toast("查询失败:" + msg);
}
});
//修改数据
//更新Person表里面id为6b6c11c537的数据,address内容更新为“北京朝阳”
Person p2 = new Person();
p2.setAddress("北京朝阳");
p2.update(this, "6b6c11c537", new UpdateListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
toast("更新成功:" + p2.getUpdatedAt());
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
toast("更新失败:" + msg);
}
});
//删除数据
Person p2 = new Person();
p2.setObjectId("6b6c11c537");
p2.delete(this, new DeleteListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
toast("删除成功");
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
toast("删除失败:" + msg);
}
});
如果是删除一个对象中的一个字段的值,用remove操作
GameScore gameScore = new GameScore();
gameScore.setObjectId("dd8e6aff28");
gameScore.remove("score"); // 删除GameScore对象中的score字段
gameScore.update(this, new UpdateListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
Log.i("bmob","删除GameScore对象中的score字段成功");
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
Log.i("bmob","删除GameScore对象中的score字段失败:"+msg);
}
});
批量的数据操作(list中的数据,不超过50条)
insertBatch updateBatch, deleteBatch 批量的添加更新删除
insertBatch的使用方式如下:
List<BmobObject> persons = new ArrayList<BmobObject>();
for (int i = 0; i < 3; i++) {
Person person = new Person();
person.setName("张三 "+i);
person.setAddress("上海朝阳路"+i+"号");
person.setGpsAdd(new BmobGeoPoint(112.934755, 24.52065));
person.setUploadTime(new BmobDate(new Date()));
List<String> hobbys = new ArrayList<String>();
hobbys.add("阅读");
hobbys.add("篮球");
hobbys.add("唱歌");
person.setHobby(hobbys);
person.setBankCard(new BankCard("中国银行", "176672673687545097"+i));
persons.add(person);
}
new BmobObject().insertBatch(this, persons, new SaveListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
toast("批量添加成功");
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
toast("批量添加失败:"+msg);
}
});
updateBatch的使用方式如下:
List<BmobObject> persons = new ArrayList<BmobObject>();
Person p1 = new Person();
p1.setObjectId("e51d651c22");
p1.setAge(25);
Person p2 = new Person();
p2.setObjectId("3f70a922c4");
p2.setAge(26);
p2.setGender(false);
Person p3 = new Person();
p3.setObjectId("08fdd55765");
p3.setAge(27);
persons.add(p1);
persons.add(p2);
persons.add(p3);
new BmobObject().updateBatch(this, persons, new UpdateListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
toast("批量更新成功");
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
toast("批量更新失败:"+msg);
}
});
deleteBatch的使用方式如下:
List<BmobObject> persons = new ArrayList<BmobObject>();
Person p1 = new Person();
p1.setObjectId("38ea274d0c");
Person p2 = new Person();
p2.setObjectId("01e29165bc");
Person p3 = new Person();
p3.setObjectId("d8226c4828");
persons.add(p1);
persons.add(p2);
persons.add(p3);
new BmobObject().deleteBatch(this, persons, new DeleteListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
toast("批量删除成功");
}
@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
toast("批量删除失败:"+msg);
}
});
查询单条数据
当我们知道某条数据的objectId
时,就可以根据objectId
直接获取单条数据对象。例如:查询objectId
为a203eba875
的人员信息。
BmobQuery<GameScore> query = new BmobQuery<GameScore>();
query.getObject(this, "a203eba875", new GetListener<GameScore>() {@Overridepublic void onSuccess(GameScore object) {// TODO Auto-generated method stub
toast("查询成功:");//获得playerName的信息
object.getPlayerName();//获得数据的objectId信息
object.getObjectId();//获得createdAt数据创建时间(注意是:createdAt,不是createAt)
object.getCreatedAt();}@Overridepublic void onFailure(int code, String arg0) {// TODO Auto-generated method stub
toast("查询失败:"+arg0);}});
查询多条数据
查询某个数据表中的所有数据是非常简单的查询操作,例如:查询GameScore表中playerName为“比目”的50条数据记录。
BmobQuery<GameScore> query = new BmobQuery<GameScore>();//查询playerName叫“比目”的数据
query.addWhereEqualTo("playerName", "比目");//返回50条数据,如果不加上这条语句,默认返回10条数据
query.setLimit(50);//执行查询方法
query.findObjects(this, new FindListener<GameScore>() {@Overridepublic void onSuccess(List<GameScore> object) {// TODO Auto-generated method stub
toast("查询成功:共"+object.size()+"条数据。");for (GameScore gameScore : object) {//获得playerName的信息
gameScore.getPlayerName();//获得数据的objectId信息
gameScore.getObjectId();//获得createdAt数据创建时间(注意是:createdAt,不是createAt)
gameScore.getCreatedAt();}}@Overridepublic void onError(int code, String msg) {// TODO Auto-generated method stub
toast("查询失败:"+msg);}});
更多的查询问题看学习笔记(2)
如果这里是特殊对象 用户管理,消息推送,acl和角色
支持的数据类型
目前为止,Bmob支持的数据类型:String、Integer、Float、Short、Byte、Double、Character、Boolean、Object、Array。
同时也支持BmobObject、BmobDate、BmobGeoPoint、BmobFile特有的数据类型。
以下为Web端类型与SDK端支持的JAVA类型对应表:
Web端类型 | 支持的JAVA类型 | 说明 |
---|---|---|
Number | Integer、Float、Short、Byte、Double、Character | 对应数据库的Number类型 |
Array | List | 数组类型 |
File | BmobFile | Bmob特有类型,用来标识文件类型 |
GeoPoint | BmobGeoPoint | Bmob特有类型,用来标识地理位置 |
Date | BmobDate | Bmob特有类型,用来标识日期类型 |
Pointer | 特定对象 | Bmob特有类型,用来标识指针类型 |
Relation | BmobRelation | Bmob特有类型,用来标识数据关联 |
类名和表名的关系
推荐使用完全一致的映射的使用方式 。就是javaBean的名字
如果想不一致的话,可以在这个javabean的构造方法中进行更改
//GameScore是我们的javaBean的名字
public GameScore() {
this.setTableName("T_a_b");
}
或者我们用这个实例的时候使用setTableName来动态的进行更改
8通知消息,用notification来进行通知
在android6.0 中使用建造者模式来进行识别build模式
NotificationManager notificationManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent pi = PendingIntent.getActivity(mContext, 0,
new Intent(MainActivity.this, MainActivity.class), 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
.setTicker("更新啦")
.setContentTitle("标题")
.setContentText("内容")
.setSmallIcon(R.drawable.ic_launcher);
Notification notification = builder.build();
notificationManager.notify(0, notification);
9原子计数器
例如文章点赞的功能,或者大量用户集中并发操作
//注意我们对应web后天的Number类型的字段,即javaBeans数据对象中的Interger对象类型
gameScore.increment("score"); // 分数递增1
gameScore.update(this, updateListener);
//您还可以通过increment(key, amount)方法来递增或递减任意幅度的数字
gameScore.increment("score", 5); // 分数递增5
//gameScore.increment("score", -5); // 分数递减5
gameScore.update(this, updateListener);
暂时就是这些,剩下的之后慢慢来。