Bmob后端云初體驗

聲明:作者原創(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)比較好脚翘。

源碼下載
CSDN下載
Github下載

個人博客傳送門:帥氣陳吃蘋果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灼卢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子来农,更是在濱河造成了極大的恐慌芥玉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件备图,死亡現(xiàn)場離奇詭異灿巧,居然都是意外死亡,警方通過查閱死者的電腦和手機揽涮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門抠藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒋困,你說我怎么就攤上這事盾似。” “怎么了雪标?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵零院,是天一觀的道長。 經(jīng)常有香客問我村刨,道長告抄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任嵌牺,我火速辦了婚禮打洼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逆粹。我一直安慰自己募疮,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布僻弹。 她就那樣靜靜地躺著阿浓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹋绽。 梳的紋絲不亂的頭發(fā)上芭毙,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音蟋字,去河邊找鬼稿蹲。 笑死,一個胖子當著我的面吹牛鹊奖,可吹牛的內(nèi)容都是我干的苛聘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼设哗!你這毒婦竟也來了唱捣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤网梢,失蹤者是張志新(化名)和其女友劉穎震缭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體战虏,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拣宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烦感。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡社。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖手趣,靈堂內(nèi)的尸體忽然破棺而出晌该,到底是詐尸還是另有隱情,我是刑警寧澤绿渣,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布朝群,位于F島的核電站,受9級特大地震影響中符,放射性物質(zhì)發(fā)生泄漏姜胖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一舟茶、第九天 我趴在偏房一處隱蔽的房頂上張望谭期。 院中可真熱鬧堵第,春花似錦吧凉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至针余,卻和暖如春饲鄙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圆雁。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工忍级, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伪朽。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓轴咱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朴肺,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評論 25 707
  • 在本文中我們將主要研究目前主要的BaaS平臺的功能窖剑,以及Google,F(xiàn)acebook戈稿,Apple等互聯(lián)網(wǎng)巨頭在B...
    青霖2018閱讀 4,018評論 2 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理西土,服務(wù)發(fā)現(xiàn),斷路器鞍盗,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 在前面聊過一些使用baas實現(xiàn)一些功能的內(nèi)容需了,今天簡單聊一下基礎(chǔ)的東西吧沒有服務(wù)端的app就是個空殼,但對個人開發(fā)...
    大王12閱讀 1,619評論 2 21
  • 愛美是女性的天性,美白水嫩的肌膚容不得有半點的瑕疵欣除,白嫩無暇的臉上住拭,如果長滿了煩人的黑頭當然是不能容忍的。...
    彩蝶f閱讀 272評論 0 0