手把手全程教你开发Android应用
的哥宝贝(功能实现篇)
上一篇UI篇介绍了页面跳转特效、导航以及地图功能的UI设计,现在给大家介绍如何使用Bmob来开发的哥宝贝的功能。
身份选择:
打开应用首先进入身份选择页面,选择角色后,向数据库添加用户信息记录,用户的ID为用户手机的Android ID。添加用户信息的时候使用Bmob的SDK向Bmob的云端服务器添加数据。实现方法如下:
/**
* 添加用户信息
*
* @param context
*/
public static void insertUserInfo(final Context context, final int identity) {
final String devicId = getDeviceID(context);
final BmobObject object = new BmobObject(USERINFO);
BmobQuery query = new BmobQuery(USERINFO);
query.whereEqualTo(USER_ID, devicId);
query.findInBackground(new FindCallback() {
@Override
public void done(List<BmobObject> arg0, BmobException arg1) {
if (arg1 != null) {
// 查询失败
//BmobException arg1为查询发生异常的回调信息,如果arg1不为空
//证明查询失败
Log.i(“bmob”, “查询用户信息失败: ” + arg1.toString());
} else {
if (0 != arg0.size()) {
// 用户信息存在
// arg0为查询成功的时候,返回所有符合查询条件的BmobObject集合
//类型为List<BmobObject>,查看该集合的大小便可知道是否存在需要查询的数据
Log.i(“bmob”, “用户信息存在”);
SharedPreferences mPrefs = context.getSharedPreferences(“taxibaby_data”, context.MODE_PRIVATE);
mPrefs.edit().putString(“objectId”, arg0.get(0).getObjectId()).commit();
TaxiBabyService.actionStart((Activity) context); //启动上传位置服务
} else {
// 用户信息不存在,进行第一次插入
//插入数据时,先实例化
// final BmobObject object = new BmobObject(USERINFO);
//如果没有这个表,初始调用方法会自动创建一个新的表,列明会按照
//列名也会按照代码中插入的自动添加
//在下次添加新的列时,再添加一行object.put(“列名”,values);即可
object.put(USER_ID, devicId);
object.put(BmobDataBase.USER_NAME, “”);
object.put(BmobDataBase.USER_PHONE, “”);
object.put(USER_IDENTITY, identity);
object.saveInBackground(new SaveCallback() {
@Override
public void done(BmobException arg0) {
if (arg0 != null) {
Log.i(“bmob”, “添加用户信息失败: “
+ arg0.toString());
} else {
Log.i(“bmob”, “添加用户信息成功”);
Intent intent = new Intent(context,
UpdatePassengerActivity.class);
intent.putExtra(“userId”, “”);
intent.putExtra(“userName”, “”);
intent.putExtra(“userPhone”, “”);
context.startActivity(intent);
TaxiBabyService
.actionStart((Activity) context);
}
}
});
}
}
}
});
}
乘客/司机列表查询:
(FindDriverActivity) (SearchActivity)
查询乘客/司机列表的方法基本上是一致的,以查找乘客为例,具体方法如下:
/**
* 查询乘客
*/
private void getData() {
BmobQuery query = new BmobQuery(BmobDataBase.USERINFO);
//wherEqualTo方法是添加操作条件
query.whereEqualTo(BmobDataBase.USER_IDENTITY, 2);
// query.setLimit(100) ;
query.findInBackground(new FindCallback() {
@Override
public void done(List<BmobObject> arg0, BmobException arg1) {
dlist.clear();
if (arg1 == null && 0 != arg0.size()) {
//查询没有异常并且查询数据不为空,返回BmobObject对象的集合
//把BmobObject历遍保存在自定义的List<BmobObject> dlist中
//不用转换成其他类型,可以直接放进Adapter中进行显示
for (BmobObject bmobObject : arg0) {
dlist.add(bmobObject);
}
} else {
if (arg1 != null) {
Log.i(“bmob”, “查询乘客信息失败:” + arg1.toString());
}
Toast.makeText(SearchActivity.this, “没有数据”,
Toast.LENGTH_SHORT).show();
}
sendMsg(0);
}
});
}
Adapter(适配器)中对dlist的处理
//取出BmobObject的值时,先获取到BmobObject,然后调用getString(“列名”)就可以获取
String addr = dlist.get(arg0).getString(BmobDataBase.USER_ADDR);
需要注意一点的是,查询数据的时候,数据返回需要一定的时间,所以数据处理尽量使用线程在后台处理,要不会出现数据输出不正常。
个人信息修改:
(DriverInfoEditActivity)
这个是司机的个人信息修改页面,修改方法与insert方法一样,只需要根据用户ID重新插入需要更改的信息,就可以覆盖原来的信息,代码如下:
user.setObjectId(mPrefs.getString(“objectId”, “domob”));
user.put(BmobDataBase.USER_NAME, tv_d_editinfo_name.getText()
.toString());
user.put(BmobDataBase.USER_PHONE, tv_d_editinfo_phone.getText()
.toString());
user.put(BmobDataBase.USER_SERVEAREA, tv_d_editinfo_addr
.getText().toString());
user.put(BmobDataBase.USER_SERVEDATE, tv_d_editinfo_time
.getText().toString());
user.put(BmobDataBase.USER_IDENTITY, 1);
if (rb_d_editinfo_sex_mail.isChecked()) {
user.put(BmobDataBase.USER_SEX, “男”);
} else {
user.put(BmobDataBase.USER_SEX, “女”);
}
user.saveInBackground(new SaveCallback() {
@Override
public void done(BmobException paramBmobException) {
if (paramBmobException == null) {
Toast.makeText(DriverInfoEditActivity.this,
“保存成功^_^”, Toast.LENGTH_SHORT).show();
} else {
// 更新失败
Toast.makeText(DriverInfoEditActivity.this,
“保存失败 =_=!”, Toast.LENGTH_SHORT).show();
}
}
});
数据删除:
(SaveRateActivity)
数据的删除操作,在乘客页面内的评分满意度中有这个功能,当乘客对未评分司机评分保存的时候,需要把未评分司机表中,刚刚评分的司机信息删除,先根据用户ID,被评分的司机ID查询出需要删除的行(可以说是对象)BmobObject,然后调用BmobObject的delect()方法。
/**
* 评分后删除该用户当前以评分司机在未评分司机的数据
*/
private void deleteNotRate(){
BmobQuery query = new BmobQuery(BmobDataBase.NOT_RATE_INFO);
//查询当前用户的未评分司机
query.whereEqualTo(BmobDataBase.NOT_RATE_USERID, userId);
//查询当前用户的未评分司机中需要删除未评分记录的司机信息
query.whereEqualTo(BmobDataBase.NOT_RATE_DRIVERID, driverId);
try {
List<BmobObject> objs = query.find();
if(null != objs && objs.size() > 0){
//objs是查询到的数据集合
但实际只有一条,所以只需要对集合的第一个对象进行删除操作就可以了
objs.get(0).delete();
}
} catch (BmobException e) {
Log.i(BmobDataBase.TAG, “删除时未评分数据时出错”);
e.printStackTrace();
}
}