聲明:作者原創(chuàng)拼卵,轉(zhuǎn)載注明出處。
作者:帥氣陳吃蘋果
一虏杰、Baas簡介
Baas讥蟆,Backend as a Service的簡稱勒虾,即“移動后端即服務(wù)”纺阔。
“移動后端即服務(wù)”是移動平臺在“云”這一概念上的一個典型實踐。Baas幫助我們把服務(wù)器的東西打包修然,做移動端的人不用再考慮如何寫服務(wù)器端笛钝、如何設(shè)計數(shù)據(jù)庫、搭建服務(wù)器等愕宋,它把這一切放在云端玻靡,用戶只需要調(diào)用API接口,就可以實現(xiàn)各種功能中贝。
Baas源于國外囤捻,在國內(nèi)的發(fā)展也很迅速,除了Bmob外邻寿,還有原子云蝎土、AVOS Cloud、百度frontia绣否、華為PowerApp等誊涯,這些平臺為開發(fā)者提供一系列的云端服務(wù),包括數(shù)據(jù)存儲蒜撮、消息推送暴构、文件服務(wù)、API分析段磨、應(yīng)用統(tǒng)計取逾、移動官網(wǎng)等,但不同的Bass提供商提供的服務(wù)的側(cè)重點不同苹支,今天我們來了解一下如何利用Bmob在云端搭建移動平臺的服務(wù)器端菌赖。
二、Bmob簡介
Bmob是國內(nèi)最早做Bass的平臺沐序,它提供的服務(wù)主要包括數(shù)據(jù)服務(wù)琉用、短信服務(wù)堕绩、即時通訊、推送功能邑时、移動支付奴紧、云端邏輯和容器服務(wù)等。
由于時間限制晶丘,我在這里僅對Bmob平臺的數(shù)據(jù)服務(wù)作一個簡單的介紹和代碼實踐黍氮,Bmob官網(wǎng)為開發(fā)者提供了非常完善的文檔,想了解其他功能的可以前往學習浅浮。
Bmob官網(wǎng):http://www.bmob.cn/
(一)數(shù)據(jù)服務(wù)基本操作
1.創(chuàng)建JavaBean
首先創(chuàng)建一個JavaBean沫浆,用于存儲用戶數(shù)據(jù),該類要繼承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.添加一行數(shù)據(jù)
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,
"數(shù)據(jù)添加成功专执!",
Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,
"數(shù)據(jù)添加失敗郁油!",
Toast.LENGTH_SHORT).show();
}
}
});
當服務(wù)器端不存在User表時本股,系統(tǒng)會根據(jù)你的User.class自動幫你創(chuàng)建表,表名和類名一致桐腌,除了User.class自身擁有的字段外拄显,還會增加objectId(數(shù)據(jù)編號)、createdAt案站、updateAt躬审、ACL字段。如果服務(wù)器端已經(jīng)存在User表和相應(yīng)的字段蟆盐,那么我們添加的數(shù)據(jù)和數(shù)據(jù)類型也要和服務(wù)器端的表一致承边,以下增刪改查操作同上。
當返回的BmobException對象為null時舱禽,說明操作成功炒刁,否則失敗。
3.獲取一行數(shù)據(jù)
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,
"數(shù)據(jù)獲取成功誊稚!",
Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,
"數(shù)據(jù)獲取成功翔始!",
Toast.LENGTH_SHORT).show();
}
}
});
4.修改一行數(shù)據(jù)
User user = new User();
user.setUserPassword("456");
user.update("objectId",new UpdateListener() {
@Override
public void done(BmobException e) {
if(e == null) {
Toast.makeText(context,
"數(shù)據(jù)修改成功!",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,
"數(shù)據(jù)修改失斃锊城瞎!",
Toast.LENGTH_SHORT).show();
}
}
});
帥氣的人會發(fā)現(xiàn),上面獲取數(shù)據(jù)時可以指定查詢條件進行數(shù)據(jù)的增加操作疾瓮,即"addWhereEqualTo()"方法脖镀,而對于數(shù)據(jù)的修改和刪除操作,目前Bmob SDK只支持通過objectId(數(shù)據(jù)編號狼电,)進行更新和刪除(當然蜒灰,獲取操作也支持根據(jù)objectId進行數(shù)據(jù)的獲认阴濉)。
自V3.4.4版本開始强窖,SDK提供了setValue(key,value)方法凸椿,用于數(shù)據(jù)的更新。如:
User user = new User();
user.setValue("userPwd","456");
5.刪除一行數(shù)據(jù)
User user = new User();
user.setObjectId("objectId");
user.delete(new UpdateListener() {
@Override
public void done(BmobException e) {
if(e == null) {
Toast.makeText(context,
"數(shù)據(jù)刪除成功翅溺!",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,
"數(shù)據(jù)刪除失斈月!",
Toast.LENGTH_SHORT).show();
}
}
});
以上咙崎,就是Bmob數(shù)據(jù)服務(wù)的基本操作优幸。下面就來練習一下吧。
(二)數(shù)據(jù)服務(wù)的實踐
1.注冊賬號
2.創(chuàng)建應(yīng)用
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
添加下列權(quán)限:
<!--允許聯(lián)網(wǎng) -->
<uses-permission android:name="android.permission.INTERNET" />
<!--獲取GSM(2g)、WCDMA(聯(lián)通3g)等網(wǎng)絡(luò)狀態(tài)的信息 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--獲取wifi網(wǎng)絡(luò)狀態(tài)的信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--保持CPU 運轉(zhuǎn)握爷,屏幕和鍵盤燈有可能是關(guān)閉的,用于文件上傳和下載 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--獲取sd卡寫的權(quán)限跛璧,用于文件上傳和下載-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許讀取手機狀態(tài) 用于創(chuàng)建BmobInstallation-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
6.初始化SDK
在啟動Activity里的onCreate()生命周期方法里添加下面這一句严里,第二個參數(shù)的值就是在第三步中獲取到的Application ID的值新啼。
Bmob.initialize(this, "你的ApplicationID");
7.創(chuàng)建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中的一個特殊的類)時,擁有特定的含義(在其數(shù)據(jù)服務(wù)的官方文檔的“用戶管理”中有介紹)刹碾,而我們只是想通過它來體驗一下增刪改查操作燥撞,所以這里為了區(qū)分,將實體類名取做“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);
}
/**
* 獲取用戶輸入數(shù)據(jù)
*/
private void getInput() {
strName = editName.getText().toString();
strPwd = editPwd.getText().toString();
}
/**
* 清除用戶輸入數(shù)據(jù)
*/
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();
}
});
}
/**
* 用戶注冊,即添加一行數(shù)據(jù)
*/
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();
}
}
});
}
/**
* 獲取用戶輸入數(shù)據(jù)
*/
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);
}
}
總結(jié):
作為平時的練手項目,使用第三方平臺的后端云對開發(fā)者來說無疑便利了很多馋吗,大大降低了學習成本和代碼復雜度焕盟,但從另一方面來看,第三方平臺的SDK對應(yīng)用層面的開發(fā)進行了代碼的封裝宏粤,而很多業(yè)務(wù)邏輯其實還是需要我們自己去實現(xiàn)比較好脚翘。
個人博客傳送門:帥氣陳吃蘋果