Bmob后端云初体验

声明:作者原创,转载注明出处。

作者:帅气陈吃苹果

一、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对应用层面的开发进行了代码的封装,而很多业务逻辑其实还是需要我们自己去实现比较好。

源码下载
CSDN下载
Github下载

个人博客传送门:帅气陈吃苹果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • 在本文中我们将主要研究目前主要的BaaS平台的功能,以及Google,Facebook,Apple等互联网巨头在B...
    青霖2018阅读 3,971评论 2 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 在前面聊过一些使用baas实现一些功能的内容,今天简单聊一下基础的东西吧没有服务端的app就是个空壳,但对个人开发...
    大王12阅读 1,603评论 2 21
  • 爱美是女性的天性,美白水嫩的肌肤容不得有半点的瑕疵,白嫩无暇的脸上,如果长满了烦人的黑头当然是不能容忍的。...
    彩蝶f阅读 267评论 0 0