Bmob實現android雲端存儲


代碼地址如下:
http://www.demodashi.com/demo/12547.html

前言

一直很困惑,android到底能不能將本地數據傳到一個公共的雲端,讓雲端實現數據庫功能,這樣的話,我們的單擊版就能實現“聯網”了。於是就產生了此篇文章。

今天講解以下內容

  1. bmob后台介紹
  2. bmob配置
  3. bmob的封裝及初始化
  4. bmob對於數據處理的方式
  5. bmob處理數據
  6. 項目結構圖和效果圖

程序實現

一. bmob后台介紹

最開始你需要在bmob官網上注冊賬號,然后登錄進去,創建應用(bmob官網地址及詳細文檔我在demo的BmobDBHelper類的開頭已經說明),會生成應用的applicationId,這個在后面會用到

二. bmob配置

首先在你的project的builder.gradle中添加依賴:

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'


    }
}

allprojects {
    repositories {
        google()
        jcenter()

        //Bmob的maven倉庫地址--必填
        maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

然后在 app對應的 build.gradle中添加依賴:

apply plugin: 'com.android.application'

    android {
        compileSdkVersion 22
        buildToolsVersion '22.0.1'

        **兼容Android6.0系統所需,如果這句話報錯,可在dependencies標簽下使用compile 'cn.bmob.android:http-legacy:1.0'**
        useLibrary 'org.apache.http.legacy'

        ...
    }


    dependencies {
    //以下SDK開發者請根據需要自行選擇
    //bmob-sdk:Bmob的android sdk包,包含了Bmob的數據存儲、文件等服務,以下是最新的bmob-sdk:
    //3.5.5:請務必查看下面注釋[1]
    compile 'cn.bmob.android:bmob-sdk:3.5.5'
    //如果你想應用能夠兼容Android6.0,請添加此依賴(org.apache.http.legacy.jar)
    compile 'cn.bmob.android:http-legacy:1.0'

    ...
    }

三.bmob的封裝及初始化

我將bmob的初始化封裝到BmobDBHelper類中,大家可以在自己應用的Application中初始化你的bmob,類似如下:

public class AppContext extends Application{

    @Override
    public void onCreate() {
        super.onCreate();

        //bmob數據庫初始化
        BmobDBHelper.getInstance().init(this);
    }

這里還需要強調的一點是,在BmobDBHelper類中有這么一段代碼:

private static final String APPLICATION_ID="XXXXXXXXXX";

其中 APPLICATION_ID 表示應用的application,“XXXXXXXXXX”為你創建的應用的applicationId值。

四.bmob對於數據處理的方式

bmob對於數據的增刪改查同樣遵循orm,即數據是以操作對象的方式來進行增刪改查的,並且操作對象需要繼承於bmob機制中的一個BmobObject類

五.bmob處理數據

數據的處理無非就是增刪改查,下面做詳細講解

5.1 添加單條數據
private void insert(){
        Person person=new Person();
        person.setNickName("大grds");
        person.setAge(20);
        person.setVip(false);

        person.save(new SaveListener<String>() {
            @Override
            public void done(String objectId, BmobException e) {
                if(objectId==null){
                    //添加成功
                    LogUtil.e(MainActivity.class,"========objectId="+objectId);
                }else{
                    //添加失敗
                    LogUtil.e(MainActivity.class,"========e="+e.getErrorCode()+"   errorMessage="+e.getMessage());
                }
            }
        });
    }
5.2 更新單條數據

每條數據添加后,在后端雲會形成一個ObjectId,即唯一id,操作單條數據的時候根據ObjectId進行更新,下面代碼中的“XXXXXX”即為對應數據的ObjectId

private void update(){
        Person p=new Person();
        p.setAge(80);
        p.update("XXXXXX", new UpdateListener() {
            @Override
            public void done(BmobException e) {
                if(e==null){
                    LogUtil.e(MainActivity.class,"===更新成功===");
                }else{
                    LogUtil.e(MainActivity.class,"更新失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }

        });
    }
5.3 刪除單條數據

下面的“objectId”為雲數據庫中對應數據的唯一id

/**刪除整條數據**/
    private void deleteObject(){
        Person p=new Person();
        p.setObjectId("objectId");
        p.delete(new UpdateListener() {
            @Override
            public void done(BmobException e) {
                if(e==null){
                    LogUtil.e(MainActivity.class,"===刪除成功===");
                }else{
                    LogUtil.e(MainActivity.class,"刪除失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }
        });
    }
5.4 刪除單條數據中的某個屬性

例如我要刪掉objectId=“qiueoieqc”的person數據中的age信息,我可以這樣操作:

/**刪除單條數據中的某個信息**/
    private void deleteAttribute(){
        Person p=new Person();
        p.setObjectId("qiueoieqc");
        p.remove("age");
        p.update(new UpdateListener() {
            @Override
            public void done(BmobException e) {
                if(e==null){
                    LogUtil.e(MainActivity.class,"===刪除屬性成功===");
                }else{
                    LogUtil.e(MainActivity.class,"刪除屬性失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }
        });
    }

bmob同樣支持批量操作,接着往下講

5.5 批量添加

增加多條數據,你可以這樣操作:

  /**批量添加**/
    private void insertList(){
        //注:泛型要寫BmobObject,不能寫Person
        List<BmobObject>personList=new ArrayList<>();
        for(int i=0;i<3;i++){
            Person person=new Person();
            person.setNickName("小花"+i);
            personList.add(person);
        }

        new BmobBatch().insertBatch(personList).doBatch(new QueryListListener<BatchResult>() {
            @Override
            public void done(List<BatchResult> list, BmobException e) {
                for(int i=0;i<list.size();i++){
                    BatchResult result = list.get(i);
                    BmobException ex =result.getError();
                    if(ex==null){
                        LogUtil.e("第"+i+"個數據批量添加成功:"+result.getCreatedAt()+","+result.getObjectId()+","+result.getUpdatedAt());
                    }else{
                        LogUtil.e("第"+i+"個數據批量添加失敗:"+ex.getMessage()+","+ex.getErrorCode());
                    }
                }
            }
        });
    }

需要注意的是

List<BmobObject>personList=new ArrayList<>();

中泛型必須用Person的父類BmobObject,不能直接用Person,否則接下來的代碼會報錯。

5.6 批量更新

更新多條數據,你可以這樣:

/**批量更新**/
    private void updateList(){
        //注:泛型要寫BmobObject,不能寫Person
        List<BmobObject>personList=new ArrayList<>();
        Person person1=new Person();
        person1.setObjectId("1cd61bcbe6");
        person1.setAge(21);
        Person person2=new Person();
        person2.setObjectId("7ac232f13e");
        person2.setAge(22);
        Person person3=new Person();
        person3.setObjectId("31ff64b2bd");
        person3.setAge(23);

        personList.add(person1);
        personList.add(person2);
        personList.add(person3);

        new BmobBatch().updateBatch(personList).doBatch(new QueryListListener<BatchResult>() {
            @Override
            public void done(List<BatchResult> list, BmobException e) {
                if(e==null){
                    for(int i=0;i<list.size();i++){
                        BatchResult result = list.get(i);
                        BmobException ex =result.getError();
                        if(ex==null){
                            LogUtil.e("第"+i+"個數據批量更新成功:"+result.getUpdatedAt());
                        }else{
                            LogUtil.e("第"+i+"個數據批量更新失敗:"+ex.getMessage()+","+ex.getErrorCode());
                        }
                    }
                }else{
                    LogUtil.e("bmob","失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }
        });
    }
5.7 批量刪除
   /**批量刪除**/
    private void deleteList(){
        //注:泛型要寫BmobObject,不能寫Person
        List<BmobObject>personList=new ArrayList<>();
        Person person1=new Person();
        person1.setObjectId("31ff64b2bd");

        Person person2=new Person();
        person2.setObjectId("7ac232f13e");

        Person person3=new Person();
        person3.setObjectId("1cd61bcbe6");

        Person person4=new Person();
        person4.setObjectId("0aa285d0ac");

        Person person5=new Person();
        person5.setObjectId("eea3673beb");

        Person person6=new Person();
        person6.setObjectId("7e6b41915a");

        Person person7=new Person();
        person7.setObjectId("4d4ab16631");

        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        personList.add(person4);
        personList.add(person5);
        personList.add(person6);
        personList.add(person7);

        new BmobBatch().deleteBatch(personList).doBatch(new QueryListListener<BatchResult>() {
            @Override
            public void done(List<BatchResult> o, BmobException e) {
                if(e==null){
                    for(int i=0;i<o.size();i++){
                        BatchResult result = o.get(i);
                        BmobException ex =result.getError();
                        if(ex==null){
                            LogUtil.e("第"+i+"個數據批量刪除成功");
                        }else{
                            LogUtil.e("第"+i+"個數據批量刪除失敗:"+ex.getMessage()+","+ex.getErrorCode());
                        }
                    }
                }else{
                    Log.i("bmob","失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }
        });
    }

bmob還支持多個操作依次進行,最后提交的處理

5.8 批量添加、批量更新、批量刪除同步提交
  /**批量添加、批量更新、批量刪除同步提交**/
    private void controList(){
        LogUtil.e(MainActivity.class,"=======批量添加、批量更新、批量刪除=======");

        BmobBatch batch =new BmobBatch();
        //批量添加
        List<BmobObject> persons = new ArrayList<BmobObject>();
        Person person = new Person();
        person.setNickName("張三 ");
        persons.add(person);
        batch.insertBatch(persons);

        //批量更新
        List<BmobObject> persons1=new ArrayList<BmobObject>();
        Person p1 = new Person();
        p1.setObjectId("ec4886adaa");
        p1.setAge(35);
        persons1.add(p1);
        batch.updateBatch(persons1);

        //批量刪除
        List<BmobObject> persons2 = new ArrayList<BmobObject>();
        Person p2 = new Person();
        p2.setObjectId("5798716e7f");
        persons2.add(p2);
        batch.deleteBatch(persons2);
        //執行批量操作
        batch.doBatch(new QueryListListener<BatchResult>() {
            @Override
            public void done(List<BatchResult> list, BmobException e) {
                if(e==null){
                    //返回結果的results和上面提交的順序是一樣的,請一一對應
                    for(int i=0;i<list.size();i++){
                        BatchResult result= list.get(i);
                        if(result.isSuccess()){//只有批量添加才返回objectId
                            LogUtil.e("第"+i+"個成功:"+result.getObjectId()+","+result.getUpdatedAt());
                        }else{
                            BmobException error= result.getError();
                            LogUtil.e("第"+i+"個失敗:"+error.getErrorCode()+","+error.getMessage());
                        }
                    }
                }else{
                    LogUtil.e("bmob","失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }
        });
    }
5.9 單條數據查詢
   /**單個查詢**/
    private void checkByObjectId(){
        new BmobQuery<Person>().getObject("5798716e7f", new QueryListener<Person>() {
            @Override
            public void done(Person person, BmobException e) {
                if(e==null){
                    //獲得createdAt數據創建時間(注意是:createdAt,不是createAt)
                    LogUtil.e(MainActivity.class,"======person  getNickName="+person.getNickName()+"  getObjectId="+person.getObjectId()+"   getCreatedAt="+person.getCreatedAt());
                }else{
                    LogUtil.e("bmob","失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }
        });
    }
5.10 查詢多條數據

最多支持一次查詢500條數據

 /**查詢多條數據,查詢的數據條數最多500**/
    private void checkList(){
        BmobQuery<Person> query = new BmobQuery<Person>();
        //查詢playerName叫“比目”的數據
        query.addWhereEqualTo("nickName", "大魚");
        //返回50條數據,如果不加上這條語句,默認返回10條數據
        query.setLimit(50);
        //執行查詢方法
        query.findObjects(new FindListener<Person>() {
            @Override
            public void done(List<Person> object, BmobException e) {
                if(e==null){
                    for (Person person : object) {
                        //獲得createdAt數據創建時間(注意是:createdAt,不是createAt)
                        LogUtil.e(MainActivity.class,"==kk====person  getNickName="+person.getNickName()+"  getObjectId="+person.getObjectId()+"   getCreatedAt="+person.getCreatedAt());
                    }
                }else{
                    Log.i("bmob","失敗:"+e.getMessage()+","+e.getErrorCode());
                }
            }
        });
    }

這里需要解釋下,其實關於bmob的查詢還有很多情況,這里就不詳細講解了,因為關於數據庫的查詢操作本來就是變化萬千,最頭疼的一環,大家可以參看bmob官網開發文檔(bmob官網地址及詳細文檔我在demo的BmobDBHelper類的開頭已經說明)做更多了解

六.項目結構圖和效果圖

項目結構圖

運行效果圖

Bmob實現android雲端存儲

代碼地址如下:
http://www.demodashi.com/demo/12547.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM