声明:作者原创,转载注明出处。
作者:帅气陈吃苹果
一、Baas简介
Baas,Backend as a Service的简称,即“移动后端即服务”。
“移动后端即服务”是移动平台在“云”这一概念上的一个典型实践。Baas帮助我们把服务器的东西打包,做移动端的人不用再考虑如何写服务器端、如何设计数据库、搭建服务器等,它把这一切放在云端,用户只需要调用API接口,就可以实现各种功能。
Baas源于国外,在国内的发展也很迅速,除了Bmob外,还有原子云、AVOS Cloud、百度frontia、华为PowerApp等,这些平台为开发者提供一系列的云端服务,包括数据存储、消息推送、文件服务、API分析、应用统计、移动官网等,但不同的Bass提供商提供的服务的侧重点不同,今天我们来了解一下如何利用Bmob在云端搭建移动平台的服务器端。
二、Bmob简介
Bmob是国内最早做Bass的平台,它提供的服务主要包括数据服务、短信服务、即时通讯、推送功能、移动支付、云端逻辑和容器服务等。
由于时间限制,我在这里仅对Bmob平台的数据服务作一个简单的介绍和代码实践,Bmob官网为开发者提供了非常完善的文档,想了解其他功能的可以前往学习。
Bmob官网:http://www.bmob.cn/
(一)数据服务基本操作
1.创建JavaBean
首先创建一个JavaBean,用于存储用户数据,该类要继承BmobObject,这样Bmob SDK才能够识别:
public class User extends BmobObject{
//用户名
private String userName;
//密码
private String userPwd;
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return this.userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
2.添加一行数据
User user = new User();
user.setUserName("sqchen");
user.setPassword("123");
user.save(new SaveListener<String>() {
@Override
public void done(String objectId,BmobException e) {
if(e==null){
Toast.makeText(context,
"数据添加成功!",
Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,
"数据添加失败!",
Toast.LENGTH_SHORT).show();
}
}
});
当服务器端不存在User表时,系统会根据你的User.class自动帮你创建表,表名和类名一致,除了User.class自身拥有的字段外,还会增加objectId(数据编号)、createdAt、updateAt、ACL字段。如果服务器端已经存在User表和相应的字段,那么我们添加的数据和数据类型也要和服务器端的表一致,以下增删改查操作同上。
当返回的BmobException对象为null时,说明操作成功,否则失败。
3.获取一行数据
BmobQuery<User> userQuery = new BmobQuery<User>();
//增加查询条件
userQuery.addWhereEqualTo("userName","sqchen");
userQuery.findObjects(new FindListener<User>() {
@Override
public void done(List<User> list, BmobException e) {
if(e == null) {
Toast.makeText(context,
"数据获取成功!",
Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,
"数据获取成功!",
Toast.LENGTH_SHORT).show();
}
}
});
4.修改一行数据
User user = new User();
user.setUserPassword("456");
user.update("objectId",new UpdateListener() {
@Override
public void done(BmobException e) {
if(e == null) {
Toast.makeText(context,
"数据修改成功!",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,
"数据修改失败!",
Toast.LENGTH_SHORT).show();
}
}
});
帅气的人会发现,上面获取数据时可以指定查询条件进行数据的增加操作,即"addWhereEqualTo()"方法,而对于数据的修改和删除操作,目前Bmob SDK只支持通过objectId(数据编号,)进行更新和删除(当然,获取操作也支持根据objectId进行数据的获取)。
自V3.4.4版本开始,SDK提供了setValue(key,value)方法,用于数据的更新。如:
User user = new User();
user.setValue("userPwd","456");
5.删除一行数据
User user = new User();
user.setObjectId("objectId");
user.delete(new UpdateListener() {
@Override
public void done(BmobException e) {
if(e == null) {
Toast.makeText(context,
"数据删除成功!",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,
"数据删除失败!",
Toast.LENGTH_SHORT).show();
}
}
});
以上,就是Bmob数据服务的基本操作。下面就来练习一下吧。
(二)数据服务的实践
1.注册账号
2.创建应用
3.获取密钥
4.导入SDK
在工程的build.gradle中添加,如图:
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
再在项目的build.gradle中添加,如图:
repositories {
jcenter()
//Bmob的maven仓库地址--必填
maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
}
5.配置AndroidManifest.xml
添加下列权限:
<!--允许联网 -->
<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
在启动Activity里的onCreate()生命周期方法里添加下面这一句,第二个参数的值就是在第三步中获取到的Application ID的值。
Bmob.initialize(this, "你的ApplicationID");
7.创建JavaBean
MyUser.class
public class MyUser extends BmobObject{
//用户名
private String userName;
//密码
private String userPwd;
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return this.userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
由于当User.class继承自BmobUser.class(BmobSDK中的一个特殊的类)时,拥有特定的含义(在其数据服务的官方文档的“用户管理”中有介绍),而我们只是想通过它来体验一下增删改查操作,所以这里为了区分,将实体类名取做“MyUser.class”。
8.登录界面
LoginActivity.class
public class LoginActivity extends AppCompatActivity implements View.OnClickListener{
private EditText editName;
private EditText editPwd;
private Button btnLogin;
private Button btnToRegister;
private String strName;
private String strPwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化BmobSDK,
Bmob.initialize(this, "你的ApplicationID");
setContentView(R.layout.activity_login);
initView();
}
/**
* 控件初始化
*/
private void initView() {
editName = (EditText) findViewById(R.id.edit_login_name);
editPwd = (EditText) findViewById(R.id.edit_login_pwd);
btnLogin = (Button) findViewById(R.id.btn_login);
btnToRegister = (Button) findViewById(R.id.btn_to_register);
btnLogin.setOnClickListener(this);
btnToRegister.setOnClickListener(this);
}
/**
* 重写按钮的点击事件
* @param view
*/
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_login:
userLogin();
break;
case R.id.btn_to_register:
toRegister();
break;
default:
break;
}
}
/**
* 用户登录
*/
private void userLogin() {
BmobQuery<MyUser> userQuery = new BmobQuery<MyUser>();
userQuery.addWhereEqualTo("userName",strName);
userQuery.addWhereEqualTo("userPwd",strPwd);
userQuery.findObjects(new FindListener<MyUser>() {
@Override
public void done(List<MyUser> list, BmobException e) {
if(e == null) {
if(list.size() == 1) {
Toast.makeText(getApplicationContext(),
"登录成功!",
Toast.LENGTH_SHORT).show();
Intent intentMain = new Intent(LoginActivity.this,MainActivity.class);
startActivity(intentMain);
} else {
Toast.makeText(getApplicationContext(),
"用户名或密码错误,请重新输入!",
Toast.LENGTH_SHORT).show();
cleanInput();
}
} else {
Toast.makeText(getApplicationContext(),
"登录失败,错误码:" + e.getErrorCode(),
Toast.LENGTH_SHORT).show();
cleanInput();
}
}
});
}
/**
* 去登录
*/
private void toRegister() {
Intent intentReg = new Intent(LoginActivity.this,RegisterActivity.class);
startActivity(intentReg);
}
/**
* 获取用户输入数据
*/
private void getInput() {
strName = editName.getText().toString();
strPwd = editPwd.getText().toString();
}
/**
* 清除用户输入数据
*/
private void cleanInput() {
editName.setText("");
editPwd.setText("");
}
}
9.注册界面
RegisterActivity.class
public class RegisterActivity extends AppCompatActivity {
private EditText editName;
private EditText editPwd;
private Button btnRegister;
private String strName;
private String strPwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initView();
}
/**
* 控件初始化
*/
private void initView() {
editName = (EditText) findViewById(R.id.edit_register_name);
editPwd = (EditText) findViewById(R.id.edit_register_pwd);
btnRegister = (Button) findViewById(R.id.btn_register);
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
userRegister();
}
});
}
/**
* 用户注册,即添加一行数据
*/
private void userRegister() {
getInput();
Log.d("sqchen",strName + strPwd);
MyUser mUser = new MyUser();
mUser.setUserName(strName);
mUser.setUserPwd(strPwd);
mUser.save(new SaveListener<String>() {
@Override
public void done(String s, BmobException e) {
if(e == null) {
Toast.makeText(getApplicationContext(),
"注册成功!请登录",
Toast.LENGTH_SHORT).show();
finish();
} else {
Toast.makeText(getApplicationContext(),
"注册失败!" + "错误码:" + e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
});
}
/**
* 获取用户输入数据
*/
private void getInput() {
strName = editName.getText().toString();
strPwd = editPwd.getText().toString();
}
}
10.登录之后的界面
登录后的主界面就是显示一段文本,没什么特别的。
MainActivity.class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
总结:
作为平时的练手项目,使用第三方平台的后端云对开发者来说无疑便利了很多,大大降低了学习成本和代码复杂度,但从另一方面来看,第三方平台的SDK对应用层面的开发进行了代码的封装,而很多业务逻辑其实还是需要我们自己去实现比较好。
个人博客传送门:帅气陈吃苹果