Bmob 開發Android程序快速入門--小demo

註冊Bmob賬號

在網址欄輸入www.bmob.cn或者在百度輸入Bmob進行搜索,打開Bmob官網後,點擊右上角的「註冊」,在跳轉頁面填入你的姓名、郵箱、設置密碼,確認後到你的郵箱激活Bmob帳戶,你就能夠用Bmob輕鬆開發應用了。html

網站後臺建立應用

登陸帳號進入bmob後臺後,點擊後臺界面左上角「建立應用」,在彈出框輸入你應用的名稱,而後確認,你就擁有了一個等待開發的應用。前端

獲取應用密鑰和下載SDK

選擇你要開發的應用,點擊該應用下方對應的「應用密鑰」java

在跳轉頁面,獲取Application ID,此ID將會在初始化SDK中使用到。android

獲取Application ID後,下載SDK,開發者能夠根據本身的需求選擇相應的iOS SDK 或Android SDK,點擊下載便可。ios

安裝BmobSDK

1、在你的項目根目錄下建立"libs"目錄,將下載的BmobSDK文件放入該目錄下。git

2、在你的應用程序中添加相應的權限:github

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_LOGS"/>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.bmob.example" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_LOGS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name="cn.bmob.example.MainActivity" android:screenOrientation="portrait" android:label="@string/app_name"> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <activity android:name=".CreateActivity" android:screenOrientation="portrait"> <activity android:name=".DeleteActivity" android:screenOrientation="portrait"> <activity android:name=".UpdateActivity" android:screenOrientation="portrait"> <activity android:name=".FindActivity" android:screenOrientation="portrait"> </application> </manifest>

初始化BmobSDK

在你應用程序啓動的Activity的onCreate()方法中初始化Bmob功能。代碼以下所示:web





package com.bmob.example; import cn.bmob.Bmob; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // 初始化 Bmob SDK // 使用時請將第二個參數Application ID替換成你在Bmob服務器端建立的Application ID Bmob.initialize(this, "Your Application ID"); } }

簡介

Bmob平臺爲您的移動應用提供了一個完整的後端解決方案,咱們提供輕量級的SDK開發包,讓開發者以最小的配置和最簡單的方式使用Bmob平臺提供的服務,進而徹底消除開發者編寫服務器代碼以及維護服務器的操做。算法

開源案例

Bmob致力於爲開發者提供快速開發服務,爲方便你們更好的理解Bmob SDK可以作的事情,咱們特地爲你們提供了一些源碼,你們能夠下載以後,嵌入Bmob的AppKey,再打包運行。數據庫

閱讀源碼是一種良好的習慣!!

即時聊天案例源碼:https://github.com/bmob/BmobIMSDK4Android

圖文社區案例源碼:https://github.com/bmob/Wonderful2 這個案例是猿圈媛圈開發團隊提供的。

校園小菜案例源碼:https://github.com/bmob/Shop 這個案例是湖工大的朋友提供的。

社交分享案例源碼:https://github.com/bmob/bmob-android-social-share 這個是金剛鎖開發者提供的

第三方登陸案例源碼:https://github.com/bmob/bmob-android-demo-thirdpartylogin 包含第三方登陸和登陸後獲取用戶信息的源碼

應用程序

在Bmob平臺註冊後,每一個帳戶可建立多個應用程序,建立的每一個應用程序都有其獨自的應用程序ID,此後全部的應用程序將憑其ID進行Bmob SDK的使用。即便只有一個應用程序,也能夠以不一樣的版本進行測試和生產。

應用安全

請你們在使用Bmob開發應用程序以前,認真閱讀咱們給你們提供的「數據與安全」的文檔,確保你的應用在發佈時安全。文檔的連接地址是:http://docs.bmob.cn/datasafety/index.html?menukey=otherdoc&key=datasafety

數據類型

目前爲止,咱們支持的數據類型有String、Integer、Boolean、ArrayList以及BmobObject對象類型。同時Bmob也支持BmobDate、BmobGeoPoint、 BmobFile數據類型。

對象

一個對象對應了數據表中的一條數據,也能夠理解爲應用程序中的JavaBean.

數據對象

Bmob存儲的數據是創建在BmobObject基礎上的,因此任何要保存的數據對象必須繼承自BmobObject類。BmobObject對象包含objectId、createdAt、updatedAt、ACL四個默認的屬性,objectId爲對象的惟一標示,能夠理解爲數據表中的主鍵,createdAt爲對象的建立時間,updatedAt爲對象的最後修改時間,ACL爲這條數據的操做權限控制。例如,遊戲中可能會用到的分數對象GameScore,它可能包含score、playerName、cheatMode等屬性,那麼這個數據對象建立的示例代碼以下:

public class GameScore extends BmobObject{ private String playerName; private Integer score; private Boolean cheatMode; private BmobFile pic; public String getPlayerName() { return playerName; } public void setPlayerName(String playerName) { this.playerName = playerName; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public Boolean getCheatMode() { return cheatMode; } public void setCheatMode(Boolean cheatMode) { this.cheatMode = cheatMode; } public BmobFile getPic() { return pic; } public void setPic(BmobFile pic) { this.pic = pic; } }

類名和表名的關係

  • 默認狀況下,Bmob提供了類名和表名徹底一致的簡單方式,實現類名和表名的映射。如,上面的GameScore類對應Web後臺的表名是GameScore(區分大小寫),若是建立一個數據對象名稱爲T_a_b,那麼這個類名對應的Web後臺的表名也是T_a_b。
  • 但不少時候,你但願在後臺建立的表名和類名並不相同,如表名爲T_a_b,而類名仍是GameScore,那麼你可使用BmobObject提供的setTableName("表名")的方法,示例代碼以下:
//這時候實際操做的表是T_a_b public class GameScore extends BmobObject{ private String playerName; private Integer score; private Boolean cheatMode; private BmobFile pic; public GameScore() { this.setTableName("T_a_b"); } public String getPlayerName() { return playerName; } //其餘方法,見上面的代碼 }

固然了,你也能夠在GameScore實例中動態調用setTableName方法,實現操做可變表(如根據日期創建表來存儲信息)的可能。

查詢自定義表名的數據

若是您使用了setTableName方法來自定義表名,那麼在對該表進行數據查詢的時候必須使用如下方法來進行查詢。須要注意的是查詢的結果是一個JSONArray,您須要自行解析JSONArray中的數據來進行使用。

/** * 查詢數據 */ public void queryData(){ BmobQuery query = new BmobQuery("T_a_b"); query.findObjects(this, new FindCallback() { @Override public void onSuccess(JSONArray arg0) { // TODO Auto-generated method stub showToast("查詢成功:"+arg0.length()); } @Override public void onFailure(int arg0, String arg1) { // TODO Auto-generated method stub showToast("查詢失敗:"+arg1); } }); }

自定義表名狀況下的更新、刪除數據和普通的更新、刪除數據方式同樣,沒有變化。儘管如此,咱們仍是提供了一個關於自定義表名狀況下增刪改查數據的Demo供開發者朋友參照源碼來學習,下載地址是:https://github.com/bmob/bmob-android-demo-dynamic-tablename

特殊對象

爲了提供更好的服務,BmobSDK中提供了BmobUser、BmobInstallation兩個特殊的BmobObject對象來完成不一樣的功能,在這裏咱們統一稱爲特殊對象。 BmobUser對象主要是針對應用中的用戶功能而提供的,它對應着web端的User表,使用BmobUser對象能夠很方便的在應用中實現用戶的註冊、登陸、郵箱驗證等功能,具體的使用方法可查看文檔的用戶部分。 BmobInstallation對象主要用於應用的安裝設備管理中,它對應着web端的Installation表,任何安裝了你應用的設備都會在此表中產生一條數據標示該設備。結合Bmob提供的推送功能,還能夠實現將自定義的消息推送給不一樣的設備終端,具體的使用方法可查看文檔的消息推送部分。

添加數據

添加數據很是簡單,任何BmobObject對象都具備save方法能夠用於將當前對象的內容保存到服務端。 例如,你如今要保存一條遊戲分數的記錄,能夠這樣作:

GameScore gameScore = new GameScore(); gameScore.setPlayerName("Barbie"); gameScore.setScore(89); gameScore.setCheatMode(false); gameScore.save(mContext, new SaveListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("添加數據成功,返回objectId爲:"+gameScore.getObjectId()); } @Override public void onFailure(int code, String arg0) { // TODO Auto-generated method stub // 添加失敗 } });

運行完以上代碼後,數據便可保存到服務器端。爲了確認數據是否真的已經保存成功,你能夠在Bmob服務器端你應用程序的數據瀏覽項目中進行查看。你應該看到相似這樣的結果:

objectId: "0c6db13c", score: 89, playerName: "Barbie", cheatMode: false,createdAt:"2013-09-27 10:32:54", updatedAt:"2013-09-27 10:32:54"

注:

  1. 在運行以上代碼時,若是服務器端你建立的應用程序中已經存在GameScore數據表和相應的score、playerName、cheatMode字段,那麼你此時添加的數據和數據類型也應該和服務器端的表結構一致,不然將保存數據失敗。

  2. 若是服務器端不存在GameScore數據表,那麼Bmob將根據你第一次(也就是運行的以上代碼)保存的GameSocre對象在服務器爲你建立此數據表並插入相應數據。

  3. 每一個BmobObject對象都有幾個默認的鍵(數據列)是不須要開發者指定的,objectId是每一個保存成功數據的惟一標識符。createdAtupdatedAt表明每一個對象(每條數據)在服務器上建立和最後修改的時間。這些鍵(數據列)的建立和數據內容是由服務器端自主來完成的。所以,使用save和insert方法時,不須要調用setObjectId方法,不然會出現提示:「It is a reserved field: objectId(105)」--代表objectId爲系統保留字段,不容許修改。

查詢數據

數據的查詢多是每一個應用都會頻繁使用到的,BmobSDK中提供了BmobQuery類,它提供了多樣的方法來實現不一樣條件的查詢,同時它的使用也是很是的簡單和方便的。

查詢全部數據

查詢某個數據表中的全部數據是很是簡單的查詢操做,例如:查詢全部人員的信息。

BmobQuery<GameScore> query = new BmobQuery<GameScore>(); query.findObjects(this, new FindListener<GameScore>() { @Override public void onSuccess(List<GameScore> object) { // TODO Auto-generated method stub toast("查詢成功:共"+object.size()+"條數據。"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:"+msg); } });

怎麼樣,是否是很簡單,並且查詢的結果不須要進行任何處理,BmobSDK已經爲你封裝成相應的JavaBean集合了,你直接使用便可。

這裏須要注意一點的是: 默認狀況下,系統實際上並不會返回全部的數據,而是默認返回10條數據記錄,你能夠經過setLimit方法設置返回的記錄數量。更多細節可點擊查看分頁查詢一節。

查詢單條數據

當咱們知道某條數據的objectId時,就能夠根據objectId直接獲取單條數據對象。例如:查詢objectId爲a203eba875的人員信息。

BmobQuery<GameScore> query = new BmobQuery<GameScore>(); query.getObject(this, "a203eba875", new GetListener<GameScore>() { @Override public void onSuccess(GameScore object) { // TODO Auto-generated method stub toast("查詢成功:"); } @Override public void onFailure(int code, String arg0) { // TODO Auto-generated method stub toast("查詢失敗:"+arg0); } });

條件查詢

在查詢的使用過程當中,基於不一樣條件的查詢是很是常見的,BmobQuery一樣也支持不一樣條件的查詢。

例如:若是要過濾掉特定鍵的值可使用addWhereNotEqualTo方法。好比須要查詢playerName不等於「Barbie」的數據時能夠這樣寫:

query.addWhereNotEqualTo("playerName", "Barbie");

固然,你能夠在你的查詢操做中添加多個約束條件,來查詢符合要求的數據。

query.addWhereNotEqualTo("playerName", "Barbie"); //名字不等於Barbie query.addWhereGreaterThan("score", 60); //條件:分數大於60歲

各類不一樣條件的比較查詢:

// 分數 < 50 query.addWhereLessThan("score", 50); //分數 <= 50 query.addWhereLessThanOrEqualTo("score", 50); //分數 > 50 query.addWhereGreaterThan("score", 50); //分數 >= 50 query.addWhereGreaterThanOrEqualTo("score", 50);

若是你想查詢匹配幾個不一樣值的數據,如:要查詢「Barbie」,「Joe」,「Julia」三我的的成績時,你可使用addWhereContainedIn方法來實現。

String[] names = {"Barbie", "Joe", "Julia"}; query.addWhereContainedIn("playerName", Arrays.asList(names));

相反,若是你想查詢排除「Barbie」,「Joe」,「Julia」這三我的的其餘同窗的信息,你可使用addWhereNotContainedIn方法來實現。

String[] names = {"Barbie", "Joe", "Julia"}; query.addWhereNotContainedIn("playerName", Arrays.asList(names));

時間查詢比較特殊,咱們須要結合BmobDate這個類來查詢某個指定日期時間先後的數據,這裏也給出示例供你們參考:

好比,你想查詢2015年2月11號以前的Person數據,那麼可使用addWhereLessThan或者addWhereLessThanOrEqualTo(包含當天)來查詢。若是想查詢以後的數據,則可使用addWhereGreaterThan或addWhereGreaterThanOrEqualTo(包含當天)來查詢。

BmobQuery<Person> query = new BmobQuery<Person>("Person"); String dateString = "2015-02-11"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = sdf.parse(dateString); } catch (ParseException e) { e.printStackTrace(); } //這是查詢2015年2月11以前的Person數據 query.addWhereLessThan("createdAt",new BmobDate(date)); //這是查詢2015年2月11以後的Person數據 //query.addWhereGreaterThan("createdAt",new BmobDate(date)); ```java ### 模糊查詢 若是你想實現相似數據庫的模糊查詢,好比,你想查詢用戶表中用戶名中含有「a」的用戶,那麼你可使用`addWhereContains`方法來實現。 ```java String value = "a"; query.addWhereContains("username", value);

分頁查詢

有時,在數據比較多的狀況下,你但願查詢出的符合要求的全部數據能按照多少條爲一頁來顯示,這時可使用setLimit方法來限制查詢結果的數據條數來進行分頁。默認狀況下,Limit的值爲10,最大有效設置值1000(設置的數值超過1000仍是視爲1000)。

query.setLimit(10); // 限制最多10條數據結果做爲一頁

在數據較多的狀況下,在setLimit的基礎上分頁顯示數據是比較合理的解決辦法,setSKip方法能夠作到跳過查詢的前多少條數據來實現分頁查詢的功能。默認狀況下Skip的值爲10。

query.setSkip(10); // 忽略前10條數據(即第一頁數據結果)

你們也能夠直接下載咱們提供的Demo源碼(https://github.com/bmob/bmob-android-demo-paging),查看如何使用分頁查詢,結合ListView開發下拉刷新查看更多內容的應用。

結果排序

對應數據的排序,如數字或字符串,你可使用升序或降序的方式來控制查詢數據的結果順序:

// 根據score字段升序顯示數據 query.order("score"); // 根據score字段降序顯示數據 query.order("-score"); // 多個排序字段能夠用(,)號分隔 query.order("-score,createdAt");

說明:多個字段排序時,先按第一個字段進行排序,再按第二個字段進行排序,依次進行。

統計對象數量

若是你只是想統計知足查詢對象的數量,你並不須要獲取全部匹配對象的具體數據信息,能夠直接使用count替代findObjects。例如,查詢一個特定玩家玩的遊戲場數:

BmobQuery<GameSauce> query = new BmobQuery<GameSauce>(); query.addWhereEqualTo("playerName", "Barbie"); query.count(this, GameSauce.class, new CountListener() { @Override public void onSuccess(int count) { // TODO Auto-generated method stub toast("Barbie has played" + count + "games"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("count failure:"+msg); } });

複雜查詢

複合與查詢(and)

有些查詢須要使用到複合「與」的查詢條件,例如:你想查詢出Person表中年齡在6-29歲之間且姓名以"y"或者"e"結尾的人,那麼,能夠採用and查詢,示例代碼以下:

//查詢年齡6-29歲之間的人,每個查詢條件都須要New一個BmobQuery對象 //--and條件1 BmobQuery<Person> eq1 = new BmobQuery<Person>(); eq1.addWhereLessThanOrEqualTo("age", 29);//年齡<=29 //--and條件2 BmobQuery<Person> eq2 = new BmobQuery<Person>(); eq2.addWhereGreaterThanOrEqualTo("age", 6);//年齡>=6 //查詢姓名以"y"或者"e"結尾的人--這個須要使用到複合或查詢(or) //--and條件3 BmobQuery<Person> eq3 = new BmobQuery<Person>(); eq3.addWhereEndsWith("name", "y"); BmobQuery<Person> eq4 = new BmobQuery<Person>(); eq4.addWhereEndsWith("name", "e"); List<BmobQuery<Person>> queries = new ArrayList<BmobQuery<Person>>(); queries.add(eq3); queries.add(eq4); BmobQuery<Person> mainQuery = new BmobQuery<Person>(); BmobQuery<Person> or = mainQuery.or(queries); //最後組裝完整的and條件 List<BmobQuery<Person>> andQuerys = new ArrayList<BmobQuery<Person>>(); andQuerys.add(eq1); andQuerys.add(eq1); andQuerys.add(or); //查詢符合整個and條件的人 BmobQuery<Person> query = new BmobQuery<Person>(); query.and(andQuerys); query.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person> object) { // TODO Auto-generated method stub toast("查詢年齡6-29歲之間,姓名以'y'或者'e'結尾的人個數:"+object.size()); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("複合與查詢失敗:"+code+",msg:"+msg); } });

複合或查詢(or)

有些狀況,在查詢的時候須要使用到複合的「或」的查詢條件。例如,你想查出 Person 表中 age 等於 29 或者 age 等於 6 的人,能夠這樣:

BmobQuery<Person> eq1 = new BmobQuery<Person>(); eq1.addWhereEqualTo("age", 29); BmobQuery<Person> eq2 = new BmobQuery<Person>(); eq2.addWhereEqualTo("age", 6); List<BmobQuery<Person>> queries = new ArrayList<BmobQuery<Person>>(); queries.add(eq1); queries.add(eq2); BmobQuery<Person> mainQuery = new BmobQuery<Person>(); mainQuery.or(queries); mainQuery.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person> object) { // TODO Auto-generated method stub } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub } });

你還能夠在此基礎上添加更多的約束條件到新建立的 BmobQuery 對象上,表示一個 and 查詢操做。

關係查詢

若是你要得到某個字段匹配特定BmobObject的對象列表,你能夠像查詢其餘數據類型同樣使用addWhereEqualTo來查詢。例如:每一個Weibo對象都包含一個BmobUser對象在它的author字段上,如今你想查詢當前用戶發佈的全部微博信息,以下:

BmobQuery<Weibo> query = new BmobQuery<Weibo>(); query.order("-updatedAt"); BmobUser user = BmobUser.getCurrentUser(this); query.addWhereEqualTo("author", user); // 查詢當前用戶的全部微博 query.findObjects(this, new FindListener<Weibo>() { @Override public void onSuccess(List<Weibo> object) { // TODO Auto-generated method stub toast("查詢成功."); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:"+msg); } });

若是你在查詢某個對象列表時,它們的某個字段是BmobObject類型,而且這個BmobObject匹配一個不一樣的查詢,這種狀況下可以使用addWhereMatchesQuery方法,請注意,默認的 limit 限制 10 也一樣做用在內部查詢上。所以若是是大規模的數據查詢,你可能須要仔細構造你的查詢對象來獲取想要的行爲。例如:要查詢帶有圖片的微博的評論列表:

BmobQuery<Comment> query = new BmobQuery<Comment>(); BmobQuery<Weibo> innerQuery = new BmobQuery<Weibo>(); innerQuery.addWhereExists("image", true); // 第一個參數爲評論表中的weibo字段名 // 第二個參數爲weibo字段的表名,也能夠直接用"Weibo"字符串的形式 // 第三個參數爲內部查詢條件 query.addWhereMatchesQuery("weibo", Weibo.class.getSimpleName(), innerQuery); query.findObjects(this, new FindListener<Comment>() { @Override public void onSuccess(List<Comment> object) { // TODO Auto-generated method stub toast("查詢成功:"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:"+msg); } });

反之,不想匹配某個子查詢,你可使用addWhereDoesNotMatchQuery方法。 好比爲了查詢微博中不帶圖片的評論列表:

BmobQuery<Comment> query = new BmobQuery<Comment>(); BmobQuery<Weibo> innerQuery = new BmobQuery<Weibo>(); innerQuery.addWhereExists("image", true); // 第一個參數爲評論表中的weibo字段名 // 第二個參數爲weibo字段的表名,也能夠直接用"Weibo"字符串的形式 // 第三個參數爲內部查詢條件 query.addWhereDoesNotMatchQuery("weibo", Weibo.class.getSimpleName(), innerQuery); query.findObjects(this, new FindListener<Comment>() { @Override public void onSuccess(List<Comment> object) { // TODO Auto-generated method stub toast("查詢成功:"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:"+msg); } });

在某些狀況下,你想在一個查詢內獲取多種類型的關聯對象。你可使用include方法。例如,你想獲取最近的 10 條評論,同時包括它們關聯的weibo:

BmobQuery<Comment> query = new BmobQuery<Comment>(); query.setLimit(10); // 限制10條 query.order("createdAt"); //按建立時間排序 query.include("weibo"); //同時將對應的微博信息也查詢出來 query.findObjects(this, new FindListener<Comment>() { @Override public void onSuccess(List<Comment> object) { // TODO Auto-generated method stub toast("查詢成功"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:"+msg); } });

你可使用 .號(英語句號)操做符來並列 include 中的內嵌的對象。好比,你同時想 include 一個 Comment 的 weibo 和weibo的 author(發佈人)對象,你能夠這樣作:

query.include("weibo.author");

這裏須要注意的是:

一、include的查詢對象只能爲BmobPointer類型,而不能是BmobRelation類型。

二、若是你想include兩個對象,你能夠這樣作:

query.include("Comment,User");

但不能以下的作法:

query.include("Comment"); query.include("User");

緩存查詢

緩存查詢一般是將查詢結果緩存在磁盤上。當用戶的設備處於離線狀態時,就能夠從緩存中獲取數據來顯示。或者在應用界面剛剛啓動,從網絡獲取數據還未獲得結果時,先使用緩存數據來顯示。這樣可讓用戶沒必要在按下某個按鈕後進行枯燥的等待。 默認的查詢操做是沒有啓用緩存的,開發者可使用setCachePolicy方法來啓用緩存功能。例如:優先從緩存獲取數據,若是獲取失敗再從網絡獲取數據。

bmobQuery.setCachePolicy(CachePolicy.CACHE_ELSE_NETWORK); // 先從緩存獲取數據,若是沒有,再從網絡獲取。 bmobQuery.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person> object) { // TODO Auto-generated method stub toast("查詢成功:共"+object.size()+"條數據。"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:"+msg); } });

Bmob SDK提供了幾種不一樣的緩存策略,以適應不一樣應用場景的需求:

  • IGNORE_CACHE

只從網絡獲取數據,且不會將數據緩存在本地,這是默認的緩存策略。

  • CACHE_ONLY

只從緩存讀取數據,若是緩存沒有數據會致使一個BmobException,能夠忽略不處理這個BmobException.

  • NETWORK_ONLY

只從網絡獲取數據,同時會在本地緩存數據。

  • CACHE_ELSE_NETWORK

先從緩存讀取數據,若是沒有,再從網絡獲取。

  • CACHE_THEN_NETWORK

先從緩存取數據,不管結果如何都會再次從網絡獲取數據。也就是說會產生2次調用。一般的用法是先快速取出緩存數據展現view,而後再後臺鏈接網絡取得最新數據,取到後用來自網絡服務器的最新數據更新view。

若是須要操做緩存內容,可使用BmobQuery提供的方法作以下操做:

  • 檢查是否存在當前查詢條件的緩存數據
    booleanisInCache = query.hasCachedResult(this);
  • 清除當前查詢的緩存數據
    query.clearCachedResult(this);
  • 清除全部查詢結果的緩存數據
    BmobQuery.clearAllCachedResults(this);
  • 設置緩存的最長時間
    query.setMaxCacheAge(100000L);

查詢指定列

有的時候,一張表的數據列比較多,而咱們只想查詢返回某些列的數據時,咱們可使用BmobQuery對象提供的addQueryKeys方法來實現。以下所示:

BmobQuery<Person> bmobQuery = new BmobQuery<Person>(); bmobQuery.addQueryKeys("objectId"); bmobQuery.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person> object) { // TODO Auto-generated method stub toast("查詢成功:共" + object.size() + "條數據。"); //注意:這裏的Person對象中只有指定列的數據。 } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:" + msg); } });

指定多列時用,號分隔每列,如:addQueryKeys("objectId,name,add");

修改數據

更新一個對象也是很是簡單。例如:將GameScore表中objectId爲0c6db13c的遊戲分數修改成77.

GameScore gameScore = new GameScore(); gameScore.setScore(77); gameScore.update(this, "0c6db13c", new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("更新成功:"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("更新失敗:"+msg); } });

刪除數據

從服務器刪除對象。例如:將GameScore表中objectId爲dd8e6aff28的數據刪除。

GameScore gameScore = new GameScore(); gameScore.setObjectId("dd8e6aff28"); gameScore.delete(this, new DeleteListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("刪除成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("刪除失敗:"+msg); } });

刪除字段

你能夠在一個對象中刪除一個字段,經過remove操做:

GameScore gameScore = new GameScore(); gameScore.setObjectId("dd8e6aff28"); gameScore.remove("score"); // 刪除GameScore對象中的score字段 gameScore.update(this, new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("刪除GameScore對象中的score字段成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("刪除GameScore對象中的score字段失敗:"+msg); } });

數組

對於數組型數據,BmobSDK提供了3種操做來原子性地更改一個數組字段: add、addAll 在一個數組字段的後面添加一些指定的對象(包裝在一個數組內) addUnique、addAllUnique 只會在本來數組字段中沒有這些對象的情形下才會添加入數組,插入數組的位置不固定的 removeAll 從一個數組字段的值內移除指定的數組中的全部對象

添加數組數據

給一個數據對象中的數組類型字段添加數據可使用如下方法添加:

Person p = new Person(); p.add("hobby", "唱歌"); // 添加一個值到hobby字段中,hobby爲數組類型 //p.addAll("hobby", Arrays.asList("游泳", "看書")); // 一次添加多個值到hobby字段中 p.save(this, new SaveListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("保存成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("保存失敗:"+msg); } });

更新數組數據

舉個例子,hobby(愛好)是一個數組類型的字段,那麼咱們能夠在hobby字段中加入一些愛好,只有在hobby字段中不包含這些愛好的狀況下才會被加入:

Person p = new Person(); p.setObjectId("d32143db92"); p.addUnique("hobby", "登山"); // 添加一個值到hobby字段中 //p.addAllUnique("hobby", Arrays.asList("游泳", "羽毛球")); // 一次添加多個值到hobby字段中 p2.update(this, new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("更新愛好成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("更新愛好失敗:"+msg); } });

查詢數組數據

對於字段類型爲數組的狀況,能夠查找字段中的數組值包含有xxx的對象:

BmobQuery<Person> query = new BmobQuery<Person>(); String [] hobby = {"閱讀","唱歌"}; query.addWhereContainsAll("hobby", Arrays.asList(hobby)); query.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person> object) { // TODO Auto-generated method stub toast("查詢成功:共" + object.size() + "條數據。"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:" + code); } });

刪除數組數據

同理咱們也可使用removeAll從數組字段中移除某些值:

Person p = new Person(); p.removeAll("hobby", Arrays.asList("閱讀","唱歌","游泳")); p.update(this, new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("從hobby字段中移除閱讀、唱歌、游泳成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("從hobby字段中移除閱讀、唱歌、游泳失敗:"+msg); } });

數據關聯

關聯關係描述

在程序設計中,不一樣類型的數據之間可能存在某種關係。好比文章和評論的關係,一篇文章對應有不少條評論,這是一對多的關係,而一條評論只屬於某一篇文章,這是一對一的關係。Bmob提供了Pointer(一對一的關係)和Relation(一對多的關係)兩種數據類型來解決這種業務需求。

本案例的場景描述

因爲關聯關係講解起來比較複雜,如下用一個簡單的案例來講明在Bmob中是如何使用關聯關係的,最後會提供相應的源碼。 這個場景是這樣的:咱們生活中每一個人均可能會辦理多張銀行卡,而每張銀行卡的登記人只有一個。從這個場景能夠看出有兩個對象,一個是人,一個是銀行卡。

Web端建立關聯字段

咱們接下來須要在Web端建立對應的表,分別是用戶表和銀行卡表,其中用戶表咱們直接使用Bmob提供的系統表User表。 在建立數據表的字段的時候,當選擇字段類型爲Pointer或Relation時,會提示你選擇該字段所指向或關聯的數據表。以下圖所示:

圖1 點擊添加雲端方法名

根據本案例的場景,咱們須要在User表中多增長一列爲cards,數據類型爲Relation,而後建立一個銀行卡信息表(BankCard),銀行卡表的主要結構以下: bankName String 銀行名稱 cardNumber String 銀行卡號 user Pointer<_User> 銀行卡用戶

爲了更直觀的展現數據表的結構,我將兩個表的截圖貼上,以供參考:

用戶表(注意cards字段)

圖1 點擊添加雲端方法名

銀行卡表(注意user字段)

圖1 點擊添加雲端方法名

建立數據對象

接下來咱們須要建立User表和BankCard表對應的數據對象,User表對應的數據對象的代碼以下:

public class MyUser extends BmobUser{ /** * 用戶名稱 */ private String nickname; /** * 用戶的銀行卡 * 一我的可能有多張不一樣的銀行卡,這裏選擇使用了BmobRelation類型 */ private BmobRelation cards; public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public BmobRelation getCards() { return cards; } public void setCards(BmobRelation cards) { this.cards = cards; } }

這裏注意的是:一、很多開發者在擴展BmobUser的時候,每每還會在屬性中加上objectId、username、password、createAt、updateAt等數據表中看到的字段和方法。實際上,BmobUser中已經實現了,若是再次聲明的話,會致使編譯性的錯誤。 二、類名能夠自定義,這個跟其餘表的命名方式有所不一樣。

BankCard表對應的數據對象的代碼以下:

public class BankCard extends BmobObject { /** * 銀行卡號 */ private String cardNumber; /** * 銀行名稱 */ private String bankName; /** * 戶主 */ private MyUser user; public String getCardNumber() { return cardNumber; } public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } public String getBankName() { return bankName; } public void setBankName(String bankName) { this.bankName = bankName; } public MyUser getUser() { return user; } public void setUser(MyUser user) { this.user = user; } }

這裏須要注意的是:一、類名要和表名保持一致。 二、MyUser屬性對應爲Pointer的指針類型。

添加關聯關係

接下來咱們就從代碼層次上來說解,怎麼樣來操做這些關聯關係的數據。首先咱們來說添加關聯關係。在咱們建立一張銀行卡信息時,須要指定這張卡的戶主(user),這就是添加的一對一的關聯關係。代碼以下:

/** * 建立一條銀行卡信息到BankCard表中,並關聯到用戶的銀行卡信息中 * @param bankName 銀行名稱 * @param cardNumber 銀行卡號 */ private void saveBankCardInfo(String bankName, String cardNumber){ if(TextUtils.isEmpty(user.getObjectId())){ toast("當前用戶的object爲空"); return; } card = new BankCard(); card.setBankName(bankName); // 設置銀行名稱 card.setCardNumber(cardNumber); // 設置銀行卡號 card.setUser(user); // 設置銀行卡戶主 card.save(this, new SaveListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("成功保存一條銀行卡信息到BankCard表中"); addCardToUser(); } @Override public void onFailure(int arg0, String arg1) { // TODO Auto-generated method stub toast("很遺憾,保存一條銀行卡信息到BankCard表中失敗了"); } }); }

修改關聯關係

當咱們的這張銀行卡建立成功後,不只僅只是設置銀行卡的戶主就能夠來,咱們還須要更新戶主的信息,也就是將當前銀行卡關聯到用戶的cards列中。這就是修改關聯關係,代碼以下:

/** * 添加銀行卡到用戶的銀行卡信息中 */ private void addCardToUser(){ if(TextUtils.isEmpty(user.getObjectId()) || TextUtils.isEmpty(card.getObjectId())){ toast("當前用戶或者當前Card對象的object爲空"); return; } BmobRelation cards = new BmobRelation(); cards.add(card); user.setCards(cards); user.update(this, new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("已成功添加到用戶的銀行卡信息中"); } @Override public void onFailure(int arg0, String arg1) { // TODO Auto-generated method stub toast("很遺憾,用戶的銀行卡信息添加失敗"); } }); }

上面的代碼將某銀行卡添加到了用戶的銀行卡信息中,還有一種狀況是從用戶的銀行卡信息中刪除掉某銀行卡的信息,在現實生活中我叫註銷個人銀行卡。代碼示例以下:

/** * 刪除用戶信息中的某銀行卡信息 */ private void removeCardToUser(){ if(TextUtils.isEmpty(user.getObjectId()) || TextUtils.isEmpty(card.getObjectId())){ toast("當前用戶或者當前Card對象的object爲空"); return; } BmobRelation cards = new BmobRelation(); cards.remove(card); user.setCards(cards); user.update(this, new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("在用戶信息中已成功移除該銀行卡信息"); } @Override public void onFailure(int arg0, String arg1) { // TODO Auto-generated method stub toast("很遺憾,移除失敗"); } }); }

查詢關聯關係

需求1:查詢個人全部銀行卡信息,代碼以下:

/** * 查詢個人全部銀行卡信息 */ private void findMyCards(){ BmobQuery<BankCard> cards = new BmobQuery<BankCard>(); /** * 注意這裏的查詢條件 * 第一個參數:是User表中的cards字段名 * 第二個參數:是指向User表中的某個用戶的BmobPo * er對象 */ cards.addWhereRelatedTo("cards", new BmobPointer(user)); cards.findObjects(this, new FindListener<BankCard>() { @Override public void onSuccess(List<BankCard> arg0) { // TODO Auto-generated method stub toast("我如今有"+arg0.size()+"張銀行卡"); for (BankCard bankCard : arg0) { Log.d("bmob", "objectId:"+bankCard.getObjectId()+",銀行名稱:"+bankCard.getBankName()+",卡號:"+bankCard.getCardNumber()); } } @Override public void onError(int arg0, String arg1) { // TODO Auto-generated method stub toast("查詢我銀行卡信息失敗"); } }); }

需求2:查詢銀行卡信息時同時獲取該卡的戶主信息,代碼以下:

/** * 查詢銀行卡信息時同時獲取該卡的戶主信息 */ private void findCardUser(){ BmobQuery<BankCard> query = new BmobQuery<BankCard>(); query.include("user"); // 注意這裏的include方法,當在查詢過程當中想將指針類型的對象信息也查詢出來是請使用此方法。 query.getObject(this, card.getObjectId(), new GetListener<BankCard>() { @Override public void onSuccess(BankCard arg0) { // TODO Auto-generated method stub toast("卡號:"+arg0.getCardNumber()+"\n" +"戶主:"+arg0.getUser().getUsername()); } @Override public void onFailure(int arg0, String arg1) { // TODO Auto-generated method stub toast("查詢銀行卡信息失敗"+arg1); } }); }

關聯關係的案例源碼

以上示例的源代碼地址是:https://github.com/bmob/bmob-android-demo-relation。若是您從文檔中還不能理解關聯關係的使用,能夠下載源碼進行學習。

批量數據操做

在BmobObject對象中提供了三種用於批量操做的方法,分別是insertBatchupdateBatchdeleteBatch,批量添加、更新、刪除。

  • insertBatch的使用方式以下:
List<BmobObject> persons = new ArrayList<BmobObject>(); for (int i = 0; i < 3; i++) { Person person = new Person(); person.setName("張三 "+i); person.setAddress("上海朝陽路"+i+"號"); person.setGpsAdd(new BmobGeoPoint(112.934755, 24.52065)); person.setUploadTime(new BmobDate(new Date())); List<String> hobbys = new ArrayList<String>(); hobbys.add("閱讀"); hobbys.add("籃球"); hobbys.add("唱歌"); person.setHobby(hobbys); person.setBankCard(new BankCard("中國銀行", "176672673687545097"+i)); persons.add(person); } new BmobObject().insertBatch(this, persons, new SaveListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("批量添加成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("批量添加失敗:"+msg); } });
  • updateBatch的使用方式以下:
List<BmobObject> persons = new ArrayList<BmobObject>(); Person p1 = new Person(); p1.setObjectId("e51d651c22"); p1.setAge(25); Person p2 = new Person(); p2.setObjectId("3f70a922c4"); p2.setAge(26); p2.setGender(false); Person p3 = new Person(); p3.setObjectId("08fdd55765"); p3.setAge(27); persons.add(p1); persons.add(p2); persons.add(p3); new BmobObject().updateBatch(this, persons, new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("批量更新成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("批量更新失敗:"+msg); } });
  • deleteBatch的使用方式以下:
List<BmobObject> persons = new ArrayList<BmobObject>(); Person p1 = new Person(); p1.setObjectId("38ea274d0c"); Person p2 = new Person(); p2.setObjectId("01e29165bc"); Person p3 = new Person(); p3.setObjectId("d8226c4828"); persons.add(p1); persons.add(p2); persons.add(p3); new BmobObject().deleteBatch(this, persons, new DeleteListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("批量刪除成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("批量刪除失敗:"+msg); } });

注意:

  1. 任何一種批量操做每次只支持最大50條記錄的操做。
  2. 批量操做不支持對User表的操做。

原子計數器

不少應用可能會有計數器功能的需求(併發請求會出現這個問題),好比某條信息被點贊多少次,若是多人同時操做,若是用普通的更新方法的話,可能會致使數據不一致的狀況。爲此,Bmob提供了原子計數器來保證原子性的修改某一數值字段的值。注意:原子計數器只能對應用於Web後臺的Number字段,和實體類實現中的Integer對象類型(類中請不要用int類型)。

gameScore.increment("score"); // 分數遞增1 gameScore.update(this, updateListener);

您還能夠經過increment(key, amount)方法來遞增或遞減任意幅度的數字

gameScore.increment("score", 5); // 分數遞增5 //gameScore.increment("score", -5); // 分數遞減5 gameScore.update(this, updateListener);

文件管理

BmobFile可讓你的應用程序將文件存儲到服務器中,常見的文件類型均可以實現存儲:好比圖像文件、影像文件、音樂文件和任何其餘二進制數據。 【注】如下均爲SDK對文件進行操做的方法,若是你想在Web端對文件進行操做,請查看咱們的幫助文檔:http://docs.bmob.cn/helps/index.html?menukey=otherdoc&key=helps#index_如何在Web後臺上傳文件(如圖片)

建立文件對象

建立文件對象方式以下:

String picPath = "sdcard/temp.jpg"; BmobFile bmobFile = new BmobFile(new File(picPath));

上傳單一文件

文件分片上傳的方法很是簡單,示例代碼以下:

String picPath = "sdcard/temp.jpg"; BmobFile bmobFile = new BmobFile(new File(picPath)); bmobFile.uploadblock(this, new UploadFileListener() { @Override public void onSuccess() { // TODO Auto-generated method stub //bmobFile.getUrl()---返回的上傳文件的地址(不帶域名) //bmobFile.getFileUrl(context)--返回的上傳文件的完整地址(帶域名) toast("上傳文件成功:" + bmobFile.getFileUrl(context)); } @Override public void onProgress(Integer value) { // TODO Auto-generated method stub // 返回的上傳進度(百分比) } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("上傳文件失敗:" + msg); } });

批量上傳文件

BmobSDK_V3.2.7新增批量上傳文件的方法,使用起來也很簡單,示例代碼以下:

//詳細示例可查看BmobExample工程中BmobFileActivity類 String filePath_mp3 = "/mnt/sdcard/testbmob/test1.png"; String filePath_lrc = "/mnt/sdcard/testbmob/test2.png"; String[] filePaths = new String[2]; filePaths[0] = filePath_mp3; filePaths[1] = filePath_lrc; Bmob.uploadBatch(this, filePaths, new UploadBatchListener() { @Override public void onSuccess(List<BmobFile> files,List<String> urls) { // TODO Auto-generated method stub //一、files-上傳完成後的BmobFile集合,是爲了方便你們對其上傳後的數據進行操做,例如你能夠將該文件保存到表中 //二、urls-上傳文件的服務器地址 } @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub ShowToast("錯誤碼"+statuscode +",錯誤描述:"+errormsg); } @Override public void onProgress(int curIndex, int curPercent, int total,int totalPercent) { // TODO Auto-generated method stub //一、curIndex--表示當前第幾個文件正在上傳 //二、curPercent--表示當前上傳文件的進度值(百分比) //三、total--表示總的上傳文件數 //四、totalPercent--表示總的上傳進度(百分比) } });

下載文件

查詢數據時獲取文件對象的示例代碼以下(文件下載的具體代碼實現須要你們自行實現):

bmobQuery.findObjects(this, new FindListener<GameSauce>() { @Override public void onSuccess(List<GameSauce> object) { // TODO Auto-generated method stub toast("查詢成功:共"+object.size()+"條數據。"); for (Person person : object) { if(person.getPic() != null){ //文件名稱 person.getPic().getFilename(); //文件下載地址 person.getPic().getFileUrl(); } } } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:"+msg); } });

刪除文件

BmobSDKV3.3.0提供了刪除文件的接口,方便開發者對文件進行管理,示例代碼以下:

BmobFile file = new BmobFile(); //此url是上傳文件成功以後經過bmobFile.getUrl()方法獲取的。 file.setUrl(url); file.delete(this, new DeleteListener() { @Override public void onSuccess() { // TODO Auto-generated method stub showToast("文件刪除成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub showToast("文件刪除失敗:"+code+",msg = "+msg); } });

爲方便你們理解文件服務的使用,Bmob提供了一個文件上傳的案例和源碼,你們能夠到示例和教程中查看和下載

注:

一、單個文件上傳大小不可超過200M;

二、文件分片上傳的大小不可超過200M;

三、有時候使用upload方式上傳不超過10M的文件的時候會出現OOM異常,故,建議開發者使用uploadblock(分片上傳)方法來上傳文件。

四、文件的批量上傳是BmobSDK_v3.2.7版本才提供的功能,如需使用,請更新版本。

縮略圖

一、 獲取縮略圖

若是你的BmobFile對象是保存的圖片類型的文件,那麼當你須要使用縮略圖功能的時候,可使用loadImageThumbnail方法來獲取改圖片的縮略圖。

bmobFile.loadImageThumbnail(this, imageView, 300, 300);

你還能夠指定獲取縮略圖的圖片質量

bmobFile.loadImageThumbnail(this, imageView, 300, 300, 100);

二、獲取圖片

不少時候您可能只是想直接加載圖片來顯示,那麼你可使用loadImage方法來加載原圖。

bmobFile.loadImage(this, imageView);

一樣您也能夠指定加載原圖顯示的大小

bmobFile.loadImage(this, imageView, 300, 300);

三、 縮略圖的案例源碼

咱們爲你們提供了縮略圖的一個簡單案例源碼,你們能夠下載查看:https://github.com/bmob/bmob-android-demo-thumbnail

新版文件管理

新版文件管理是經過BmobProFile類(自BmobSDKv3.2.9開始)完成的,其提供了文件的單一上傳、批量上傳、文件下載、生成縮略圖等功能,

BmobProFile和BmobFile二者之間是不兼容的,也就是說不能用BmobFile類上傳的成功後獲得的文件名再用BmobProFile類提供的下載方法來下載。

單一上傳

單一文件上傳只須要調用BmobProFile類提供的靜態方法:upload,示例代碼以下:

BTPFileResponse response = BmobProFile.getInstance(MainActivity.this).upload(filePath, new UploadListener() { @Override public void onSuccess(String fileName,String url) { // TODO Auto-generated method stub dialog.dismiss(); showToast("文件已上傳成功:"+fileName); } @Override public void onProgress(int ratio) { // TODO Auto-generated method stub BmobLog.i("MainActivity -onProgress :"+ratio); } @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub showToast("上傳出錯:"+errormsg); } });

onSuccess方法參數:

一、fileName:文件名(帶後綴),這個文件名是惟一的,開發者須要記錄下該文件名,方便後續下載該文件。

二、url:文件服務器地址(若是你上傳的是圖片類型的文件,此url地址並不能直接在瀏覽器查看(會出現404錯誤),須要通過URL簽名獲得真正的可訪問的URL地址)。

URL簽名

一、使用場景:

開發者上傳的若是是圖片且但願可以訪問完整的URL地址用來客戶端直接顯示圖片,那麼就須要用到URL簽名。

二、簽名認證步驟:

1)、開啓簽名認證:

開發者須要在web後臺開啓文件管理的URL簽名認證:

文件管理-->基本配置-->設置SecretKey-->開啓-->保存

注:此處的secretKey可任意填寫,它是專門針對文件服務的,和"應用密鑰"中的數據服務使用到的SecretKey是不同的。

此部分爲配置了URL的簽名認證安全的開發者使用,若沒配置,則按照正常處理。

2)、URL簽名說明:

URL簽名,須要攜帶簽名後的參數,用於驗證當前的來源的數據是否遭到破壞等。

開啓簽名認證的URL地址格式:

URL=url(文件上傳成功以後返回的url地址)?t=(客戶端類型)&a=(應用密鑰中的AccessKey)&e=(時間)&token=(token簽名)

未開啓簽名認證的URL地址格式:

URL=url(文件上傳成功以後返回的url地址)?t=(客戶端類型)&a=(應用密鑰中的AccessKey)

注:

一、t:客戶端類型(1~19表明SDK客戶端,1:IOS,2:Android,3:wp,…,20:官網後臺;21:其餘網站)

二、AccessKey:在web後臺的應用密鑰中查看

三、e:當前服務器的時間戳+有效時長,以秒爲單位。

四、Token:Token簽名使用了web後臺的文件管理中設置的SecretKey,開發者要注意此值的安全不被泄漏.

3)、URL簽名步驟:

請求的文件名稱fileName: dfwsdweqe0012.jpg;

請求的文件服務器地址url:http://testAPi.bmob.cn/dfwsdweqe0012.jpg

假如請求參數爲:

假設當前的時間戳爲:1415697063 有效時間時長爲:300秒,則e=1415697063+300,

當前時間戳:e= 1415697363 // unix time時間,單位爲秒

當前客戶端類型: t=1 //註釋:Android

App的AccessKey:a=b63737a2825821fc3208b8a80a524da

當前的密鑰SecretKey:abcdefg

組裝請求URI:

Uri = /dfwsdweqe0012.jpg?t=1&a=b63737a2825821fc3208b8a80a524da&e=1415697363

獲得Token:

一、針對Uri進行HMAC-SHA1算法簽名;

二、對簽名後的字符串進行URL安全Base64編碼;

三、編碼後即爲要要發送的token。

僞代碼以下:

Token=urlbase64_encode(hmacsha1(Uri, secretKey));

獲得token= vMs1nom-Pf-WQRgNs8EA2aiQQpo=

獲得最終的發送請求的URL爲:

http://testAPi.bmob.cn/dfwsdweqe0012.jpg?t=1&a=b63737a2825821fc3208b8a80a524da & e=1415697363&token=vMs1nom-Pf-WQRgNs8EA2aiQQpo=

注:一、以上全部的參數名(t,a,e,token)均爲小寫,參數順序爲t,a,e,token,uri、secretkey等編碼格式都爲utf-8。

二、URL安全的Base64編碼方式的基本過程是先將內容以Base64格式編碼爲字符串,而後檢查該編碼後的字符串,將字符串中的加號+換成中劃線-,斜槓/換成下劃線_,獲得最終的字符串;

4)、URL簽名方法:

鑑於URL簽名比較複雜,BmobSDKV3.3.0的BmobProFile類爲開發者提供了獲取URL簽名的方法:signURL(V3.3.2已修改成BmobProFile類的內部方法)

 /** * @param fileName:文件名 * @param fileUrl :文件url地址 * @param accessKey:web應用密鑰中的AccessKey * @param effectTime:有效時長(秒) * @param secretKey:密鑰 * @return 可訪問的URL地址 */ String URL = BmobProFile.getInstance(MainActivity.this).signURL(String fileName,String fileUrl,String accessKey,long effectTime,String secretKey)

未開啓URL簽名認證的示例代碼以下:

String URL =BmobProFile.getInstance(MainActivity.this).signURL("dfwsdweqe0012.jpg","http://testAPi.bmob.cn/dfwsdweqe0012.jpg","b63737a2825821fc3208b8a80a524da",0,null);

已開啓URL簽名認證的示例代碼以下:

String URL = BmobProFile.getInstance(MainActivity.this).signURL("dfwsdweqe0012.jpg","http://testAPi.bmob.cn/dfwsdweqe0012.jpg","b63737a2825821fc3208b8a80a524da",100,"abcdefg");

注:

一、fileName/fileUrl:表示上傳(批量上傳)成功後獲得的文件名/文件服務器地址。

二、effectTime:表示這個URL請求的有效時長,單位爲秒,一旦超過有效時長,則該URL請求失效。

三、若開發者未開啓URL簽名認證,則前三個參數必填,後面的effectTime傳0,secretKey傳null便可。

四、若文件類型爲圖片類型,客戶端須要直接顯示的話,則不建議開啓URL簽名認證

批量上傳

BmobProFile一樣提供了批量上傳文件的靜態方法:uploadBatch:示例代碼以下:

BmobProFile.getInstance(MainActivity.this).uploadBatch(files, new UploadBatchListener() { @Override public void onSuccess(boolean isFinish,String[] fileNames,String[] urls) { // TODO Auto-generated method stub if(isFinish){ dialog.dismiss(); } showToast(""+isFinish+"-----"+Arrays.asList(fileNames)+"----"+Arrays.asList(urls)); } @Override public void onProgress(int curIndex, int curPercent, int total,int totalPercent) { // TODO Auto-generated method stub dialog.setProgress(curIndex); BmobLog.i("MainActivity -onProgress :"+curIndex+"---"+curPercent+"---"+total+"----"+totalPercent); } @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub dialog.dismiss(); showToast("批量上傳出錯:"+statuscode+"--"+errormsg); } }); }

onProgress方法參數:

一、curIndex :表示當前第幾個文件正在上傳

二、curPercent :表示當前上傳文件的進度值(百分比)

三、total :表示總的上傳文件數

四、totalPercent:表示總的上傳進度(百分比)

文件下載

BmobProFile一樣提供了文件下載的靜態方法:download,只須要將上傳文件後記錄下來的文件名fileName(必須是經過BmobProFile類的upload方法獲得的)做爲參數便可,示例代碼以下:

 BmobProFile.getInstance(MainActivity.this).download(fileName, new DownloadListener() { @Override public void onSuccess(String fullPath) { // TODO Auto-generated method stub showToast("下載成功:"+fullPath); } @Override public void onProgress(String localPath, int percent) { // TODO Auto-generated method stub BmobLog.i("MainActivity -download-->onProgress :"+percent); dialog.setProgress(percent); } @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub dialog.dismiss(); showToast("下載出錯:"+statuscode +"--"+errormsg); } });

注:

一、onProgress參數localPath:表示當前下載文件的地址,當下載進度不爲100的時候,這個地址下面的文件是不完整的,只有一部分。

二、onSuccess參數fullPath :表示下載成功後文件的存儲完整地址,和localpath的路徑是同樣的。

三、容許開發者自定義保存下載文件的目錄名,可在Apllication中對其進行初始化配置。示例以下:

BmobConfiguration config = new BmobConfiguration.Builder(context).customExternalCacheDir("目錄名").build(); BmobPro.getInstance(context).initConfig(config);

縮略圖處理

對圖片進行縮略圖處理,BmobProFile類提供了兩種方式:

一種將生成縮略圖的任務提交給服務器,由服務器來處理並同步返回生成後的服務器縮略圖地址(submitThumnailTask);另外一種是SDK提供的本地處理縮略圖的方法(getLocalThumbnail)。

1、submitThumnailTask

示例代碼以下:

 BmobProFile.getInstance(MainActivity.this).submitThumnailTask(fileName, modelId, new ThumbnailListener() { @Override public void onSuccess(String thumbnailName,String thumbnailUrl) { // TODO Auto-generated method stub //此處獲得的縮略圖地址(thumbnailUrl)不必定可以請求的到,此方法爲異步方法 BmobLog.i("MainActivity -onSuccess :"+thumbnailName+"-->"+thumbnailUrl); } @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub BmobLog.i("MainActivity -onError :"+statuscode+"---"+errormsg); } });

注:

A、請求參數:fileName:文件名,modelId :縮略圖的規格類型ID

B、thumbnailName的格式:

fileName+"_"+modelId

若是fileName=f24af10cbc15476e9789afaf168c3b8e.jpg,modelId=1,那麼thumbnailName=f24af10cbc15476e9789afaf168c3b8e.jpg_1。

C、目前Bmob提供的規格類型ID(modelId)有六種:

1--指定寬,高自適應,等比例縮放;

2--指定高,寬自適應,等比例縮放;

3--指定最長邊,短邊自適應,等比例縮放;

4--指定最短邊,長邊自適應,等比例縮放;

5--指定最大寬高,等比例縮放;

6--固定寬高,居中裁剪;

2、getLocalThumbnail

SDK提供了三種處理本地縮略圖的方式:

1、指定規格ID

示例代碼以下:

BmobProFile.getInstance(LocalThumbnailActivity.this).getLocalThumbnail(localPath, modelId, new LocalThumbnailListener() { @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub BmobLog.i("MainActivity -localThumbnail-->生成縮略圖失敗 :"+statuscode+","+errormsg); } @Override public void onSuccess(String thumbnailPath) { // TODO Auto-generated method stub BmobLog.i("MainActivity -localThumbnail-->生成後的縮略圖路徑 :"+thumbnailPath); } });

2、指定規格ID、寬、高

示例代碼以下:

BmobProFile.getInstance(LocalThumbnailActivity.this).getLocalThumbnail(localPath, modeId, width, height, new LocalThumbnailListener() { @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub showToast("本地縮略圖建立失敗 :"+statuscode+","+errormsg); } @Override public void onSuccess(String thumbnailPath) { // TODO Auto-generated method stub showToast("本地縮略圖建立成功 :"+thumbnailPath); } });

3、指定規格ID、寬、高、圖片壓縮質量

爲了方便開發者對圖片進行壓縮處理,V3.3.3版本在獲取本地縮略圖的方法中新增了圖片壓縮質量(quality)參數,取值範圍:0-100。示例代碼以下:

BmobProFile.getInstance(LocalThumbnailActivity.this).getLocalThumbnail(localPath, modeId, width, height, quality,new LocalThumbnailListener() { @Override public void onError(int statuscode, String errormsg) { // TODO Auto-generated method stub showToast("本地縮略圖建立失敗 :"+statuscode+","+errormsg); } @Override public void onSuccess(String thumbnailPath) { // TODO Auto-generated method stub showToast("本地縮略圖建立成功 :"+thumbnailPath); } });

注:

一、localPath:圖片的本地路徑,須要帶後綴名

二、modelId:開發者應事先在應用管理後臺(文件管理-->自定義版本-->縮略圖配置版本)完成基本的生成縮略圖的規格配置:

數據實時同步

數據實時同步是一個超酷的功能!

SDK能夠實現對數據表或行的監聽,當這個表或者行的數據發生變化時,Bmob會當即將變化的信息告知SDK。 這種服務很是適合作遊戲開發(如,開發鬥地主遊戲,三我的同時監聽一行數據的變化,任何一我的出牌都會將數據寫入到這行數據中,其餘人也就當即知道了)、羣聊(一羣人監聽某個表的變化,任何人發言都會將數據寫入到這個表中,其餘人也能夠當即知道了)等實時性要求很高的場景中。

爲方便你們快速瞭解數據的實時同步服務,咱們提供了一個簡單的應用實例( https://github.com/bmob/bmob-android-demo-realtime-data )供你們參考。

開始鏈接

使用數據實時功能,首先須要建立BmobRealTimeData對象,而後調用start方法鏈接服務器。

BmobRealTimeData rtd = new BmobRealTimeData(); rtd.start(this, new ValueEventListener() { @Override public void onDataChange(JSONObject data) { // TODO Auto-generated method stub Log.d("bmob", "("+data.optString("action")+")"+"數據:"+data); } @Override public void onConnectCompleted() { // TODO Auto-generated method stub Log.d("bmob", "鏈接成功:"+rtd.isConnected()); } });

start方法中的ValueEventListener參數用於監聽鏈接成功和數據變化的回調。當有數據變化時會經過onDataChange回調方法反饋到客戶端。開發者只須要處理獲得的data就能夠了。

注:

一、監聽器不支持UI線程,在監聽回調中請不要直接操做UI;

二、若是你要監聽User、Installation等系統表的話,表名前須要加上「_」,例如:_User

監聽數據

在BmobRealTimeData對象鏈接成功後,就能夠進行數據的監聽了。BmobSDK提供了監聽表和行的方法以下:

// 監聽表更新 rtd.subTableUpdate(tableName); // 監聽表刪除 rtd.subTableDelete(tableName); // 監聽行更新 rtd.subRowUpdate(tableName, objectId); // 監聽行刪除 rtd.subRowDelete(tableName, objectId);

其中tableName爲要監聽的數據表名,objectId爲要監聽的數據行Id, 一般比較保險的作法是在BmobRealTimeData對象的鏈接狀態爲true的狀況下進行監聽,代碼以下:

if(rtd.isConnected()){ // 監聽表更新 rtd.subTableUpdate(tableName); }

取消監聽

當開發者想取消監聽某個行爲是,可以使用下面的方法:

// 取消監聽表更新 rtd.unsubTableUpdate(testTableName); // 取消監聽表刪除 rtd.unsubTableDelete(testTableName); // 取消監聽行更新 rtd.unsubRowUpdate(testTableName, objectId); // 取消監聽行刪除 rtd.unsubRowDelete(testTableName, objectId);

用戶管理

用戶是一個應用程序的核心。對於我的開發者來講,本身的應用程序積累到越多的用戶,就會給本身帶來越強的創做動力。所以Bmob提供了一個專門的用戶類——BmobUser來自動處理用戶帳戶管理所需的功能。

有了這個類,你就能夠在你的應用程序中添加用戶帳戶功能。

BmobUser是BmobObject的一個子類,它繼承了BmobObject全部的方法,具備BmobObject相同的功能。不一樣的是,BmobUser增長了一些特定的關於用戶帳戶管理相關的功能。

屬性

BmobUser除了從BmobObject繼承的屬性外,還有幾個特定的屬性: username: 用戶的用戶名(必需)。 password: 用戶的密碼(必需)。 email: 用戶的電子郵件地址(可選)

擴展用戶類

不少時候,你的用戶表還會有不少其餘字段,如性別、年齡、頭像等。那麼,你須要對BmobUser類進行擴展,添加一些新的屬性。示例代碼以下所示:

public class SpecialUser extends BmobUser { private boolean sex; private String nick; public boolean getSex() { return this.sex; } public void setSex(boolean sex) { this.sex = sex; } public String getNick() { return this.sex; } public void setNick(String nick) { this.nick = nick; } }

更多代碼實現你們能夠下載SDK,在裏面的BmobExample中查找MyUser類,參考它的用法。

建立用戶對象

建立用戶對象以下:

BmobUser user = new BmobUser();

註冊用戶

你的應用程序可能會要求用戶註冊。下面的代碼是一個典型的註冊過程:

BmobUser bu = new BmobUser(); bu.setUsername("sendi"); bu.setPassword("123456"); bu.setEmail("sendi@163.com"); bu.signUp(this, new SaveListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("註冊成功:"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("註冊失敗:"+msg); } });

在註冊過程當中,服務器會對註冊用戶信息進行檢查,以確保註冊的用戶名和電子郵件地址是獨一無二的。此外,對於用戶的密碼,你能夠在應用程序中進行相應的加密處理後提交。

若是註冊不成功,你能夠查看返回的錯誤對象。最有可能的狀況是,用戶名或電子郵件已經被另外一個用戶註冊。這種狀況你能夠提示用戶,要求他們嘗試使用不一樣的用戶名進行註冊。

你也能夠要求用戶使用Email作爲用戶名注冊,這樣作的好處是,你在提交信息的時候能夠將輸入的「用戶名「默認設置爲用戶的Email地址,之後在用戶忘記密碼的狀況下可使用Bmob提供重置密碼功能。

這裏有兩點須要注意的:

  • 有些時候你可能須要在用戶註冊時發送一封驗證郵件,以確認用戶郵箱的真實性。這時,你只須要登陸本身的應用管理後臺,在應用設置->郵件設置(下圖)中把「郵箱驗證」功能打開,Bmob雲後端就會在註冊時自動發動一封驗證給用戶。

  • username字段是大小寫敏感的字段,若是你但願應用的用戶名不區分大小寫,請在註冊和登陸時進行大小寫的統一轉換。

登陸用戶

當用戶註冊成功後,您須要讓他們之後可以用註冊的用戶名登陸到他們的帳戶使用應用。要作到這一點,你可使用BmobUser類的login方法。

BmobUser bu2 = new BmobUser(); bu2.setUsername("lucky"); bu2.setPassword("123456"); bu2.login(this, new SaveListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("登陸成功:"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("登陸失敗:"+msg); } });

獲取當前用戶

若是用戶在每次打開你的應用程序時都要登陸,這將會直接影響到你應用的用戶體驗。爲了不這種狀況,你可使用緩存的CurrentUser對象。

每當你應用的用戶註冊成功或是第一次登陸成功,都會在本地磁盤中有一個緩存的用戶對象,這樣,你能夠經過獲取這個緩存的用戶對象來進行登陸:

BmobUser bmobUser = BmobUser.getCurrentUser(this); if(bmobUser != null){ // 容許用戶使用應用 }else{ //緩存用戶對象爲空時, 可打開用戶註冊界面… }

在擴展了用戶類的狀況下獲取當前登陸用戶,可使用以下的示例代碼(SpecialUser類可參看上面):

SpecialUser userInfo = BmobUser.getCurrentUser(this,SpecialUser.class);

退出登陸

退出登陸很是簡單,可使用以下的代碼:

BmobUser.logOut(this); //清除緩存用戶對象 BmobUser currentUser = BmobUser.getCurrentUser(this); // 如今的currentUser是null了

更新用戶

不少狀況下你可能須要修改用戶信息,好比你的應用具有修改我的資料的功能,Bmob提供的用戶更新方式有兩種寫法:

第一種:新建一個用戶對象,並調用update(context,objectId,updateListener)方法來更新(推薦使用),示例:

BmobUser newUser = new BmobUser(); newUser.setEmail("xxx@163.com"); BmobUser bmobUser = BmobUser.getCurrentUser(this); newUser.update(this,bmobUser.getObjectId(),new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("更新用戶信息成功:"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("更新用戶信息失敗:" + msg); } });

第二種:獲取本地的用戶對象,並調用update(context,updateListener)方法來更新(不推薦使用),示例:

BmobUser bmobUser = BmobUser.getCurrentUser(this); // 修改用戶的郵箱爲xxx@163.com bmobUser.setEmail("xxx@163.com"); bmobUser.update(this,new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("更新用戶信息成功:"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("更新用戶信息失敗:" + msg); } });

一、開發者在進行用戶更新操做的時候,推薦使用第一種方式來進行用戶的更新操做,由於此方法只會更新你提交的用戶信息(好比只會向服務器提交當前用戶的email值),而不會將本地存儲的用戶信息也提交到後臺更新。

二、在更新用戶信息時,若是用戶郵箱有變動而且在管理後臺打開了郵箱驗證選項的話,Bmob雲後端一樣會自動發一封郵件驗證信息給用戶。

查詢用戶

查詢用戶和查詢普通對象同樣,只需指定BmobUser類便可,以下:

BmobQuery<BmobUser> query = new BmobQuery<BmobUser>(); query.addWhereEqualTo("username", "lucky"); query.findObjects(this, new FindListener<BmobUser>() { @Override public void onSuccess(List<BmobUser> object) { // TODO Auto-generated method stub toast("查詢用戶成功:"+object.size()); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢用戶失敗:"+msg); } });

瀏覽器中查看用戶表

User表是一個特殊的表,專門存儲BmobUser對象。在瀏覽器端,你會看到一個User表旁邊有一個小人的圖標。

密碼重置

一旦你引入了一個密碼系統,那麼確定會有用戶忘記密碼的狀況。對於這種狀況,咱們提供了一種方法,讓用戶安全地重置起密碼。

重置密碼的流程很簡單,開發者只須要求用戶輸入註冊的電子郵件地址便可:

final String email = "xxx@163.com"; BmobUser.resetPassword(this, email, new ResetPasswordListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("重置密碼請求成功,請到" + email + "郵箱進行密碼重置操做"); } @Override public void onFailure(int code, String e) { // TODO Auto-generated method stub toast("重置密碼失敗:" + e); } });

密碼重置流程以下:

  1. 用戶輸入他們的電子郵件,請求重置本身的密碼。
  2. Bmob向他們的郵箱發送一封包含特殊的密碼重置鏈接的電子郵件。
  3. 用戶根據嚮導點擊重置密碼鏈接,打開一個特殊的Bmob頁面,根據提示他們能夠輸入一個新的密碼。
  4. 用戶的密碼已被重置爲新輸入的密碼。

找回密碼

爲方便你們瞭解如何用Bmob開發找回密碼的功能,咱們爲你們準備了另一份文檔,詳細見咱們在Github中的文檔:

https://github.com/bmob/bmob-cloudcode-demo/blob/master/HOW-TO-FIND-PASSWORD.md

郵箱驗證

設置郵件驗證是一個可選的應用設置, 這樣能夠對已經確認過郵件的用戶提供一部分保留的體驗,郵件驗證功能會在用戶(User)對象中加入emailVerified字段, 當一個用戶的郵件被新添加或者修改過的話,emailVerified會被默認設爲false,若是應用設置中開啓了郵箱認證功能,Bmob會對用戶填寫的郵箱發送一個連接, 這個連接能夠把emailVerified設置爲 true.

emailVerified 字段有 3 種狀態能夠考慮:

  • true : 用戶能夠點擊郵件中的連接經過Bmob來驗證地址,一個用戶永遠不會在新建立這個值的時候顯示emailVerified爲true。
  • false : 用戶(User)對象最後一次被刷新的時候, 用戶並無確認過他的郵箱地址, 若是你看到emailVerified爲false的話,你能夠考慮刷新用戶(User)對象。
  • missing : 用戶(User)對象已經被建立,但應用設置並無開啓郵件驗證功能; 或者用戶(User)對象沒有email郵箱。

請求驗證Email

發送給用戶的郵箱驗證郵件會在一週內失效,能夠經過調用 requestEmailVerify 來強制從新發送:

final String email = "xxx@qq.com"; BmobUser.requestEmailVerify(this, email, new EmailVerifyListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("請求驗證郵件成功,請到" + email + "郵箱中進行激活。"); } @Override public void onFailure(int code, String e) { // TODO Auto-generated method stub toast("請求驗證郵件失敗:" + e); } });

第三方帳號登錄

Bmob提供了很是簡單的方法來實現使用第三方帳號登錄的功能,目前支持新浪微博、QQ帳號的登錄。

新浪微博帳號登錄

使用新浪微博帳號登錄,須要先在新浪微博開放平臺中建立應用並獲得appkey和redirectUrl,在新浪微博開放平臺建立應用的步驟能夠參考新浪微博提供的開發文檔。而後將新浪微博提供的SDK和BmobSDK同樣放入本身項目的libs目錄中。接下來就是在程序中調用BmobSDK提供的方法了。示例代碼以下:

BmobUser.weiboLogin(this, "appkey", "redirectUrl", new OtherLoginListener() { @Override public void onSuccess(JSONObject userAuth) { // TODO Auto-generated method stub toast("第三方登錄成功:"+userAuth); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("第三方登錄失敗:"+msg); } });

QQ帳號登錄

使用QQ帳號登錄,一樣也須要在騰訊開放平臺中建立應用並獲得appid,在騰訊開放平臺建立應用的步驟能夠參考騰訊開放平臺提供的開發文檔。而後將騰訊提供的SDK和BmobSDK同樣放入本身項目的libs目錄中。使用騰訊SDK還須要在AndroidManifest.xml文件中添加相應的配置以下:

<!-- qq回調須要註冊該activity --> <activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <!-- qq受權須要註冊該activity --> <activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tencent你的AppId" /> </intent-filter> </activity>

最後是在程序中調用BmobSDK提供的方法了,示例代碼以下:

BmobUser.qqLogin(this, "appid", new OtherLoginListener() { @Override public void onSuccess(JSONObject userAuth) { // TODO Auto-generated method stub toast("第三方登錄成功:"+userAuth.toString()); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("第三方登錄失敗:"+msg); } });

第三方帳號與BmobUser綁定

若是你的應用中有其餘功能已經使用到了相關第三方平臺的功能,好比社交分享功能,那麼你能夠將已經獲得的用戶受權信息傳遞給BmobSDK來便捷地與BmobUser進行綁定。如下代碼展現了將第三方帳號和已經存在的BmobUser對象進行綁定:

BmobUser.associateWithAuthDate(this, BmobUser.getCurrentUser(this), userAuth, new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub } });

以上代碼中的參數userAuth是由開發者構造的JSONObject格式的第三方平臺受權信息,相關平臺的受權信息格式以下所示: 新浪微博的userAuth內容:

{"weibo": { "uid": "145785469", "access_token": "2.00vs9yFCI8FrHCba4951pdq5vn1slZ", "expiration_in": "78000" } }

QQ的userAuth內容:

{"qq": { "openid": "AAC61872C459FB196AECFA9D6FEBA334", "access_token": "19A1E9FB3E440B4D15DBB44a39946FD4", "expires_in": 7776000 } }

解除綁定

解除第三方帳號與BmobUser的綁定關係以下代碼所示:

BmobUser.dissociateAuthData(this, BmobUser.getCurrentUser(this), new UpdateListener() { @Override public void onSuccess() { // TODO Auto-generated method stub toast("解除綁定成功"); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("解除綁定失敗:"+msg); } });

第三方登陸的案例源碼

你們能夠下載咱們提供的案例源碼:https://github.com/bmob/bmob-android-demo-thirdpartylogin 這個源碼包含了第三方登陸的源碼和登陸以後如何獲取用戶基本信息的部分。

ACL和角色

數據安全是軟件系統中最重要的組成部分,爲了更好的保護應用數據的安全,Bmob在軟件架構層面提供了應用層次、表層次、ACL(Access Control List:訪問控制列表)、角色管理(Role)四種不一樣粒度的權限控制的方式,確保用戶數據的安全(詳細請查看Bmob數據與安全頁面,瞭解Bmob如何保護數據安全)。

其中,最靈活的方法是經過ACL和角色,它的思路是每一條數據有一個用戶和角色的列表,以及這些用戶和角色擁有什麼樣的許可權限。

大多數應用程序須要對不一樣的數據進行靈活的訪問和控制,這就可使用Bmob提供的ACL模式來實現。例如:

  • 對於私有數據,讀寫權限能夠只侷限於數據的全部者。
  • 對於一個論壇,會員和版主有寫的權限,通常的遊客只有讀的權限。
  • 對於日誌數據只有開發者纔可以訪問,ACL能夠拒絕全部的訪問權限。
  • 屬於一個被受權的用戶或者開發者所建立的數據,能夠有公共的讀的權限,可是寫入權限僅限於管理者角色。
  • 一個用戶發送給另一個用戶的消息,能夠只給這些用戶賦予讀寫的權限。

用Bmob SDK,你能夠對這些數據設置一個默認的ACL,這樣,即便黑客反編譯了你的應用,獲取到Application Key,也仍然沒法操做和破壞你的用戶數據,確保了用戶數據的安全可靠。而做爲開發者,當你須要對這些數據進行管理時,能夠經過超級權限Key(Master Key)進行。

默認訪問權限

在沒有顯示指定的狀況下,每個BmobObject(表)中的ACL(列)屬性的默認值是全部人可讀可寫的。在客戶端想要修改這個權限設置,只須要簡單調用BmobACL的setPublicReadAccess方法和setPublicWriteAccess方法,即:

BmobACL aCL = new BmobACL(); aCL.setPublicReadAccess(true); aCL.setPublicWriteAccess(true);

注意:可讀可寫是默認的權限,不須要寫額外的代碼。

指定用戶的訪問權限

假如你想實現一個分享日誌類的應用時,這可能會須要針對不一樣的日誌設定不一樣的訪問權限。好比,公開的日誌,發佈者有更改和修改的權限,其餘用戶只有讀的權限,那麼可用以下代碼實現:

Blog blog = new Blog(); blog.setTitle("論電影的七個元素"); blog.setContent("這是blog的具體內容"); BmobACL acl = new BmobACL(); //建立一個ACL對象 acl.setPublicReadAccess(true); // 設置全部人可讀的權限 acl.setWriteAccess(BmobUser.getCurrentUser(this), true); // 設置當前用戶可寫的權限 blog.setACL(acl); //設置這條數據的ACL信息 blog.save(this, new SaveListener() { @Override public void onSuccess() { //添加成功 } @Override public void onFailure(int code, String msg) { //添加失敗 } });

有時,用戶想發表一篇不公開的日誌,這種狀況只有發佈者纔對這篇日誌擁有讀寫權限,相應的代碼以下:

Blog blog = new Blog(); blog.setTitle("一我的的祕密"); blog.setContent("這是blog的具體內容"); BmobACL acl = new BmobACL(); //建立ACL對象 acl.setReadAccess(BmobUser.getCurrentUser(this), true); // 設置當前用戶可寫的權限 acl.setWriteAccess(BmobUser.getCurrentUser(this), true); // 設置當前用戶可寫的權限 blog.setACL(acl); //設置這條數據的ACL信息 blog.save(this, new SaveListener() { @Override public void onSuccess() { //添加成功 } @Override public void onFailure(int code, String msg) { //添加失敗 } });

角色管理

上面的指定用戶訪問權限雖然很方便,可是對於有些應用可能會有必定的侷限性。好比一家公司的工資系統,員工和公司的出納們只擁有工資的讀權限,而公司的人事和老闆才擁有所有的讀寫權限。要實現這種功能,你也能夠經過設置每一個用戶的ACL權限來實現,以下:

 //建立公司某用戶的工資對象 WageInfo wageinfo = new WageInfo(); wageinfo.setWage(100000); //這裏建立四個用戶對象,分別爲老闆、人事小張、出納小謝和本身 BmobUser boss; BmobUser hr_zhang; BmobUser cashier_xie; BmobUser me; //建立ACL對象 BmobACL acl = new BmobACL(); //設置四個用戶讀的權限 acl.setReadAccess(boos, true); acl.setReadAccess(hr_zhang, true); acl.setReadAccess(cashier_xie, true); acl.setReadAccess(me, true); //設置老闆和人事小張對這個工資的寫權限 acl.setWriteAccess(boss, true); acl.setWriteAccess(hr_zhang, true); //設置工資對象的ACL wageinfo.setACL(acl); wageinfo.save(this, new SaveListener() { @Override public void onSuccess() { //保存成功 } @Override public void onFailure(int code, String msg) { //保存失敗 } });

可是,一個公司的人事、出納和員工不只僅只有一我的,同時還會有離職、調換崗位以及新員工加入等問題存在。若是用上面的代碼對公司的每一個人進行一一設置的話是不現實的,既麻煩也很難維護。針對這個問題,咱們能夠利用BmobRole來解決。咱們只須要對用戶進行分類,每一個分類賦予不一樣的權限。以下代碼實現:

//建立公司某用戶的工資對象 WageInfo wageinfo = new WageInfo(); wageinfo.setWage(100000); //這裏建立四個用戶對象,分別爲老闆、人事小張、出納小謝和本身 BmobUser boss; BmobUser hr_zhang; BmobUser hr_luo; BmobUser cashier_xie; BmobUser me; //建立HR和Cashier兩個用戶角色(這裏爲了舉例BmobRole的使用,將這段代碼寫在這裏,正常狀況下放在員工管理界面會更合適) BmobRole hr = new BmobRole("HR"); BmobRole cashier = new BmobRole("Cashier"); //將hr_zhang和hr_luo歸屬到hr角色中 hr.getUsers().add(hr_zhang); hr.getUsers().add(hr_luo); //保存到雲端角色表中(web端能夠查看Role表) hr.save(this); //將cashier_xie歸屬到cashier角色中 cashier.getUsers().add(cashier_xie); //保存到雲端角色表中(web端能夠查看Role表) cashier.save(this); //建立ACL對象 BmobACL acl = new BmobACL(); acl.setReadAccess(boos, true); // 假設老闆只有一個, 設置讀權限 acl.setReadAccess(me, true); // 給本身設置讀權限 acl.setRoleReadAccess(hr, true); // 給hr角色設置讀權限 acl.setRoleReadAccess(cashier, true); // 給cashier角色設置讀權限 acl.setWriteAccess(boss, true); // 設置老闆擁有寫權限 acl.setRoleWriteAccess(hr, true); // 設置ht角色擁有寫權限 //設置工資對象的ACL wageinfo.setACL(acl); wageinfo.save(this);

須要說明一點的是,Web端的Role表也具備ACL的列,你能夠將角色管理的權限賦予某些用戶。

角色之間的從屬關係

下面咱們來講一下角色與角色之間的從屬關係。用一個例子來講明下:一個互聯網企業有移動部門,部門中有不一樣的小組,如Android開發組和IOS開發組。每一個小組只擁有本身小組的代碼讀寫權限,但這兩個小組同時擁有核心庫代碼的讀權限。

//建立MobileDep(移動研發部)、AndroidTeam(android開發組)和iOSTeam(ios開發組)三個角色 BmobRole mobileDep = new BmobRole("MobileDep"); BmobRole androidTeam = new BmobRole("AndroidTeam"); BmobRole iosTeam = new BmobRole("iOSTeam"); //保存AndroidTeam和iosTeam角色到雲端 androidTeam.save(this); iosTeam.save(this); //將androidTeam和iosTeam兩種角色添加到移動部門角色中 mobileDep.getRoles().add(androidTeam); mobileDep.getRoles().add(iosTeam); mobileDep.save(this); // 假設建立三個代碼數據對象 Code coreCode = new Code(); Code androidCode = new Code(); Code iosCode = new Code(); //......此處省略一些具體的屬性設定 coreCode.save(this); androidCode.save(this); iosCode.save(this); //設置androidTeam角色對androidCode對象的讀和寫的權限 androidCode.setRoleReadAccess(androidTeam, true); androidCode.setRoleWriteAccess(androidTeam, true); //設置iosTeam角色對iosCode對象的讀和寫的權限 iosCode.setRoleReadAccess(iosTeam, true); iosCode.setRoleWriteAccess(iosTeam, true); //設置mobileDep角色能夠對coreCode對象進行讀操做 coreCode.setRoleReadAccess(mobileDep);

ACL案例源碼

咱們爲你們提供一個ACL相關的案例源碼,你們能夠點擊下載:https://github.com/bmob/bmob-android-demo-acl

地理位置

Bmob容許用戶根據地球的經度和緯度座標進行基於地理位置的信息查詢。經過在BmobObject的查詢中添加一個BmobGeoPoint的對象查詢,你就能夠實現輕鬆查找出離當前用戶最接近的信息或地點的功能。

建立地理位置對象

首先須要建立一個BmobGeoPoint對象。例如,建立一個東經116.39727786183357度,北緯39.913768382429105度的BmobGeoPoint對象:

BmobGeoPoint point = new BmobGeoPoint(116.39727786183357, 39.913768382429105);

查詢地理位置信息

如今,你的數據表中有了必定的地理座標對象的數據,這樣能夠測試找出最接近某個點的信息了。你可使用BmobQuery對象的addWhereNear方法來這樣作:

BmobQuery<Person> bmobQuery = new BmobQuery<Person>(); bmobQuery.addWhereNear("gpsAdd", new BmobGeoPoint(112.934755, 24.52065)); bmobQuery.setLimit(10); //獲取最接近用戶地點的10條數據 bmobQuery.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person> object) { // TODO Auto-generated method stub toast("查詢成功:共" + object.size() + "條數據。"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:" + msg); } });

要限制查詢指定距離範圍的數據可使用addWhereWithinKilometersaddWhereWithinMilesaddWhereWithinRadians方法。

要查詢一個矩形範圍內的信息可使用addWhereWithinGeoBox來實現:

BmobGeoPoint southwestOfSF = new BmobGeoPoint(116.10675, 39.711669); BmobGeoPoint northeastOfSF = new BmobGeoPoint(116.627623, 40.143687); BmobQuery<Person> query = new BmobQuery<Person>(); query.addWhereWithinGeoBox("gpsAdd", southwestOfSF, northeastOfSF); query.findObjects(this, new FindListener<Person>() { @Override public void onSuccess(List<Person> object) { // TODO Auto-generated method stub toast("查詢成功:共" + object.size() + "條數據。"); } @Override public void onError(int code, String msg) { // TODO Auto-generated method stub toast("查詢失敗:" + msg); } });

注意事項 目前有幾個須要注意的地方:

  1. 每一個BmobObject數據對象中只能有一個BmobGeoPoint對象。

  2. 地理位置的點不能超過規定的範圍。緯度的範圍應該是在-90.0到90.0之間。經度的範圍應該是在-180.0到180.0之間。若是您添加的經緯度超出了以上範圍,將致使程序錯誤。

雲端代碼的調用

不少時候,單純的前端代碼是不能完成所有事情的,一些重要和複雜的業務邏輯仍是但願可以在服務端中執行。好比:對比較大量的比賽數據進行排序,對某個網站進行資料採集和處理,獲取用戶的IP信息,等等。Bmob不只提供了雲端存儲,還開放了雲端的業務邏輯代碼功能,也就是雲端代碼。

相關雲端代碼的使用,你們能夠參考開發文檔: http://docs.bmob.cn/cloudcode/developdoc/index.html?menukey=develop_doc&key=develop_cloudcode

雲端代碼的執行有多種方法:

其中,在SDK中調用雲端代碼的方法以下:

AsyncCustomEndpoints ace = new AsyncCustomEndpoints(); //第一個參數是上下文對象,第二個參數是雲端代碼的方法名稱,第三個參數是上傳到雲端代碼的參數列表(JSONObject cloudCodeParams),第四個參數是回調類 ace.callEndpoint.callEndpoint(MainActivity.this, cloudCodeName, params, new CloudCodeListener() { @Override public void onSuccess(Object object) { // TODO Auto-generated method stub toast("雲端usertest方法返回:" + object.toString()); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("訪問雲端usertest方法失敗:" + msg); } });

消息推送

消息推送簡介

推送通知是讓用戶及時被通知、和你的應用保持聯繫的一種很是棒的方式,你能夠快速而有效地通知到全部的用戶,下面這個教程將會教你如何使用Bmob來推送消息。

消息推送快速入門

1、在Bmob官方網站的下載界面中,選擇下載AndroidSDK,將下載的zip壓縮包進行解壓,獲得bmobPush_(版本號).jar,而後將它放在你項目根目錄下的"libs"目錄中。

2、在您的應用程序AndroidManifest.xml文件中添加相應的權限:

<!-- BmobPush SDK權限 --> <permission android:protectionLevel="normal" android:name="cn.bmob.permission.push"></permission> <uses-permission android:name="cn.bmob.permission.push"/><!-- 添加自定義的權限--> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />

3、在您的應用程序AndroidManifest.xml文件中註冊BmobPush SDK運行所需的推送服務和消息接收器:

 <service android:label="PushService" android:name="cn.bmob.push.lib.service.PushService" android:process="cn.bmob.push" android:permission="cn.bmob.permission.push" android:exported="true"> <intent-filter> <action android:name="cn.bmob.push.lib.service.PushService"/> </intent-filter> </service> <receiver android:name="cn.bmob.push.PushReceiver" > <intent-filter android:priority="2147483647" ><!--優先級加最高--> <!-- 系統啓動完成後會調用 --> <action android:name="android.intent.action.BOOT_COMPLETED" /> <!-- 解鎖完成後會調用 --> <action android:name="android.intent.action.USER_PRESENT" /> <!-- 監聽網絡連通性 --> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>

4、在你的應用程序中建立一個消息接收器。

Push消息經過action=cn.bmob.push.action.MESSAGE的Intent把數據發送給客戶端your.package.MyPushMessageReceiver,消息格式由應用本身決定,PushService只負責把服務器下發的消息以字符串格式透傳給客戶端。 your.package.MyPushMessageReceiver代碼示例以下:

public class MyPushMessageReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if(intent.getAction().equals(PushConstants.ACTION_MESSAGE)){ Log.d("bmob", "客戶端收到推送內容:"+intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING)); } } }

5、啓動推送服務

在你的應用程序主Activity中調用以下方法:

 // 使用推送服務時的初始化操做 BmobInstallation.getCurrentInstallation(this).save(); // 啓動推送服務 BmobPush.startWork(this, "你的AppKey");

代碼中的"你的AppKey"就是你在Bmob後臺中建立的應用程序的AppKey,若是你不知道這是什麼,能夠參考快速入門文檔中的註冊Bmob帳號部分。

6、在web端進行推送設置

在應用面板-->消息推送-->推送設置界面中填寫包名進行保存。 

7、在web端推送消息

完成以上步驟後,你能夠運行應用程序,從web推送一條消息給客戶端。 

在後臺推送消息給Android和iOS兩個平臺的時候,有一些須要注意的: 一、因爲Android和iOS的提送機制不一樣,iOS要通過APNS,Android的推送徹底是走Bmob的長鏈接服務,爲兼容這個問題,若是你選擇發送格式爲「json」格式時,須要添加APNS兼容頭部(見下面json的aps部分),推送內容格式以下:

{ "aps": { "sound": "cheering.caf", "alert": "這個是通知欄上顯示的內容", "badge": 0 }, "xx" : "json的key-value對,你能夠根據狀況添加更多的,客戶端進行解析獲取", }

其中,sound是iOS接收時的聲音,badge是iOS通知欄的累計消息數。

二、若是你選擇發送格式爲「text」時,推送內容爲「推送消息測試。。。。」,Bmob會自動添加aps部分發送給APNS,,至關於自動生成以下的json格式的推送內容:

{ "aps": { "alert": "推送消息測試。。。。", } }

同時,也會發送給Android端,至關於自動生成以下的json格式的推送內容:

{ "alert" : "推送消息測試。。。。", }

三、若是隻是發送給Android端,你們能夠自定義json格式的數據。

四、因爲iOS的APNS的推送的大小是有限制的,默認最多256bytes,所以,若是你須要跨平臺互通的話,需注意推送的內容不要太長。

五、想要更多瞭解Bmob的推送格式的朋友,如即時聊天,能夠查看咱們在問答社區中的回答:http://wenda.codenow.cn//?/question/204

8、源碼下載

爲了更好的讓開發者朋友正確的集成和使用Bmob推送功能,咱們還提供了一個關於Bmob推送功能的簡單Demo以供你們參考,有須要的朋友能夠到以下地址進行源碼的下載。https://github.com/bmob/bmob-android-demo-push

消息推送的視頻教程和Demo

Bmob官方爲你們準備了消息推送的視頻教程,有須要的朋友能夠移步瀏覽視頻教程:

客戶端推送消息:http://v.youku.com/v_show/id_XNzQ4ODczOTc2.html

集成BmobPushSDK:http://v.youku.com/v_show/id_XNzQ4ODczOTc2.html

其餘相關說明

以上文檔僅僅介紹瞭如何實現消息的一次性推送,若是你還須要用到其餘的推送方法,如組播、廣播等,還須要詳細閱讀下面的相關知識。

安裝消息推送服務

每個Bmob的App被安裝在用戶的設備上後,若是要使用消息推送功能,Bmob SDK會自動生成一個Installation對象。Installation對象包含了推送所須要的全部信息。舉例:一個棒球的App,你可讓用戶訂閱感興趣的棒球隊,而後及時將這個球隊的消息推送給用戶 。 您可使用 BmobSDK,經過 BmobInstallation 對象進行一系列操做,就像你存儲和獲取其餘的普通對象同樣,好比BmobObject對象。

BmobInstallation對象有幾個系統默認的特殊字段來幫助你進行設備定位等管理:

  • channels : 當前這個設備訂閱的渠道名稱數組
  • timeZone : 設備所在位置的時區, 如Asia/Shanghai,這個會在每一個BmobInstallation對象更新時同步(只讀)
  • deviceType : 設備的的類型, 值爲:"ios" 或 "android" (只讀)
  • installationId : Bmob使用的設備惟一號 (只讀)
保存 installation

使用消息推送前,首先須要保存設備信息。

BmobInstallation.getCurrentInstallation(this).save();

你還能夠經過定義繼承自BmobInstallation的JavaBean來爲BmobInstallation對象添加更多的屬性,用來定製更通用的推送。

public class MyBmobInstallation extends BmobInstallation { private int score; public int getScore() { return score; } public void setScore(int score) { this.score = score; } }

訂閱頻道和退訂

訂閱頻道

訂閱頻道可以使用 subscribe 方法

BmobInstallation installation = BmobInstallation.getCurrentInstallation(this); installation.subscribe("Giants"); installation.subscribe("Mets"); installation.save();
退訂頻道

退訂頻道可以使用 unsubscribe 方法

BmobInstallation installation = BmobInstallation.getCurrentInstallation(this); installation.unsubscribe("Giants"); installation.save();

廣播推送消息

在客戶端實現推送消息的功能,經過 BmobPushManager 對象來完成,好比給全部設備推送一條消息,以下:

BmobPushManager bmobPush = new BmobPushManager(this); bmobPush.pushMessageAll("Hello Bmob.");

組播推送消息

發送消息給訂閱了Giants頻道的用戶

BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); List<String> channels = new ArrayList<String>(); channels.add("Giants"); query.addWhereEqualTo("channels", channels); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");

同時發送消息給多個頻道時,能夠將其餘頻道添加在channels中。

多播推送消息

推送給不活躍的用戶
BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereLessThan("updatedAt", new BmobDate(new Date())); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");
根據查詢條件作推送
BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereEqualTo("score", 80); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");

請注意,where 條件查詢的都是 installations 表。這裏是假設 installations 表存儲了 score 的Number屬性,你能夠像查詢普通對象同樣構造where查詢

根據平臺作推送

給Android平臺的終端推送

BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereEqualTo("deviceType", "android"); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");

給IOS平臺的終端推送

BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereEqualTo("deviceType", "ios"); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");
根據地理位置信息作推送
BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereWithinRadians("location", new BmobGeoPoint(112.934755, 24.52065), 1.0); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");

上面的例子假設 installation 表中有個 location 屬性是 GeoPoint 類型,咱們就能夠根據地理信息位置作推送。

點播推送消息

發送給Android單個客戶端

String installationId = "客戶端installationId"; BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereEqualTo("installationId", installationId); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");

發送給iOS單個客戶端

String deviceToken = "客戶端deviceToken"; BmobPushManager bmobPush = new BmobPushManager(this); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereEqualTo("deviceToken", deviceToken); bmobPush.setQuery(query); bmobPush.pushMessage("消息內容");

短信服務

因爲Bmob官方對外提供的服務都是免費的,而短信服務產生的費用咱們沒法把控,所以短信服務的功能咱們沒有直接對外提供,而主要針對有須要的合做客戶。若是你有這方面的須要,能夠聯繫咱們的技術客服琪琪(QQ:2395453054)。

短信服務的功能包括:

  • 短信驗證碼服務(註冊和找回密碼等);
  • 短信模板服務(須要你先設定短信模板,方便運營商審覈,不支持法律禁止或者與政策相違背的短信服務);
  • 可自定義短信後綴,如「尊敬的*,你購買的商品已經在快遞中,請注意查收。【Bmob快遞】」,其中Bmob快遞就是短信後綴,能夠替換爲你的公司名稱。

其餘功能

獲取服務器時間

在Bmob對象中提供了一個靜態方法,用於獲取服務器時間。

Bmob.getServerTime(MainActivity.this, new GetServerTimeListener() { @Override public void onSuccess(long time) { // TODO Auto-generated method stub SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm"); String times = formatter.format(new Date(time * 1000L)); toast("當前服務器時間爲:" + times); } @Override public void onFailure(int code, String msg) { // TODO Auto-generated method stub toast("獲取服務器時間失敗:" + msg); } });

自動更新組件

Bmob爲你們提供了應用的自動更新組件,使用這個組件能夠快速方便實現應用的自動升級功能。 詳細的使用操做能夠參考文檔:http://docs.bmob.cn/android/autoupdate/index.html?menukey=otherdoc&key=autoupdate

錯誤碼列表

因爲Android SDK是基於RestApi接口實現的,所以,如下只提供與Android相關的錯誤碼,若是你在開發過程當中發現有其餘的錯誤碼,請點擊查看咱們的RestFul開發文檔中提供的錯誤碼文檔:http://docs.bmob.cn/errorcode/index.html?menukey=otherdoc&key=errorcode

9001

內容:AppKey is Null, Please initialize BmobSDK.

含義:AppKey爲空,請初始化。

9002

內容:Parse data error

含義:解析返回數據出錯

9003

內容:upload file error

含義:上傳文件出錯

9004

內容:upload file failure

含義:文件上傳失敗

9005

內容:A batch operation can not be more than 50

含義:批量操做只支持最多50條

9006

內容:objectId is null

含義:objectId爲空

9007

內容:BmobFile File size must be less than 10M.

含義:文件大小超過10M

9008

內容:BmobFile File does not exist.

含義:上傳文件不存在

9009

內容:No cache data.

含義:沒有緩存數據

9010

內容:The network is not normal.(Time out)

含義:網絡超時

9011

內容:BmobUser does not support batch operations.

含義:BmobUser類不支持批量操做

9012

內容:context is null.

含義:上下文爲空

9013

內容: BmobObject Object names(database table name) format is not correct.

含義:BmobObject(數據表名稱)格式不正確

9014

含義:第三方帳號受權失敗

9015

含義:其餘錯誤均返回此code

9016

內容:The network is not available,please check your network!

含義:無網絡鏈接,請檢查您的手機網絡。

混淆打包的相關問題

因爲Bmob Android SDK自己進行了代碼混淆,所以,你在給應用打包編譯混淆時,請不要混淆BmobSDK的代碼,另外,任何繼承自BmobObject、BmobUser的JavaBean請不要混淆。具體可參考BmobExample中proguard-project.txt的代碼:

-ignorewarnings # 這裏根據具體的SDK版本修改 -libraryjars libs/bmob_v3.0.9beta.jar -keepattributes Signature -keep class cn.bmob.v3.** {*;} # 保證繼承自BmobObject、BmobUser類的JavaBean不被混淆 -keep class com.example.bmobexample.Person{*;} -keep class com.example.bmobexample.MyUser{*;} -keep class com.example.bmobexample.relationaldata.Weibo{*;} -keep class com.example.bmobexample.relationaldata.Comment{*;}



代碼不復制來。、
我仿寫到該代碼:代碼

能夠參考視頻教程:http://www.imooc.com/learn/254
相關文章
相關標籤/搜索