最近在帮别人做毕业设计,其中需要用到Bmob后端云,环境是Android平台。
Bmob是个很方便的东西,主要用于后台数据管理方面,但我感觉它的开发文档写的并不好,很多东西没有解释清楚,而且文档的API和demo中用的SDK版本不一样,有时候让人很误解。
其中Bmob的官网地址如下,可以免费注册个帐号
关于Android导包、配置环境、添加权限这些就不说了,具体步骤参考Bmob官网,这里主要说的是如何获取Bmob表里的数据。
项目背景是关于地铁线路查询,所以数据表设计如下,其中ID是主键,为唯一的值:
public class Station extends BmobObject implements Comparable<Station>{
private String name; // 站点名称
private int id; // 站点的编号ID
private int lineId; // 这个站点在哪条地铁线
private boolean isChanged; // 这个站点是否可以换乘其他线
public void setName( String name ) {
this.name = name;
}
public void setId( int id ) {
this.id = id;
}
public void setLineId( int lineId ) {
this.lineId = lineId;
}
public void setChanged( boolean isChanged ) {
this.isChanged = isChanged;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public int getLineId() {
return lineId;
}
public boolean getIsChanged() {
return isChanged;
}
}
Bmob后台可视化的表如下:
我们的目标就是获取表里的数据,Bmob SDK为我们提供BmobQuery<Object>接口,重写里边的方法即可。
如果只想获取某一行数据,这个办法有时行不通,因为Bmob的查询是一个线程操作,不是顺序执行的,所以有时候你会查询失败(其实大多数情况下你都会失败)。
一个可行的解决办法是把表里所有数据都扒下来,然后再分拣出自己需要的数据,关键代码如下:
private void loadData() {
BmobQuery<Station> bmobQuery = new BmobQuery<Station>();
bmobQuery.findObjects(new FindListener<Station>() {
@Override
public void done(List<Station> list, BmobException e) {
if (e == null) {
n = list.size();
System.out.println(n);
for (int i = 0; i < n; i++) {
station[i] = list.get(i);
}
String str = "";
for (int i = 0; i < n; i++) {
str = str + station[i].getName() + " " + station[i].getId() + " " + station[i].getLineId() + "号线\n";
System.out.println(station[i].getName() + "," + station[i].getId() + "," + station[i].getLineId());
}
textView.setText(str);
}
else {
System.out.println(e.getErrorCode());
}
}
});
}
运行的结果如图,
但是你会发现,为什么和表中的数据顺序不一样?因为刚才提到Bmob的查询是多线程执行的,造成线程之间的访问顺序不一致,怎么解决?
其实只要加一个排序就OK了,在Station类中加一个排序的接口,之后调用sort函数就可以。修改后的代码如下:
public class Station extends BmobObject implements Comparable<Station>{
private String name; // 站点名称
private int id; // 站点的编号ID
private int lineId; // 这个站点在哪条地铁线
private boolean isChanged; // 这个站点是否可以换乘其他线
public void setName( String name ) {
this.name = name;
}
public void setId( int id ) {
this.id = id;
}
public void setLineId( int lineId ) {
this.lineId = lineId;
}
public void setChanged( boolean isChanged ) {
this.isChanged = isChanged;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public int getLineId() {
return lineId;
}
public boolean getIsChanged() {
return isChanged;
}
@Override
public int compareTo(Station o) { // 根据ID比较的排序函数
if( this.getId() < o.getId() ) {
return -1;
}
else return 1;
}
}
private void loadData() {
BmobQuery<Station> bmobQuery = new BmobQuery<Station>();
bmobQuery.findObjects(new FindListener<Station>() {
@Override
public void done(List<Station> list, BmobException e) {
if (e == null) {
n = list.size();
System.out.println(n);
for (int i = 0; i < n; i++) {
station[i] = list.get(i);
}
Arrays.sort(station, 0, n); // 新加了一个排序函数
String str = "";
for (int i = 0; i < n; i++) {
str = str + station[i].getName() + " " + station[i].getId() + " " + station[i].getLineId() + "号线\n";
System.out.println(station[i].getName() + "," + station[i].getId() + "," + station[i].getLineId());
}
textView.setText(str);
}
else {
System.out.println(e.getErrorCode());
}
}
});
}
真机运行的结果如下:
这样我们就把整个数据表都扒了下来,然后再根据我们的需要进行筛选。