注冊Bmob帳號
在網址欄輸入www.bmob.cn或者在百度輸入Bmob進行搜索,打開Bmob官網后,點擊右上角的“注冊”,在跳轉頁面填入你的姓名、郵箱、設置密碼,確認后到你的郵箱激活Bmob賬戶,你就可以用Bmob輕松開發應用了。

網站后台創建應用
登錄賬號進入bmob后台后,點擊后台界面左上角“創建應用”,在彈出框輸入你應用的名稱,然后確認,你就擁有了一個等待開發的應用。

獲取應用密鑰和下載SDK
選擇你要開發的應用,點擊該應用下方對應的“應用密鑰”

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

獲取Application ID后,下載SDK,開發者可以根據自己的需求選擇相應的iOS SDK 或Android SDK,點擊下載即可。

安裝BmobSDK
一、在你的項目根目錄下創建"libs"目錄,將下載的BmobSDK文件放入該目錄下。
二、在你的應用程序中添加相應的權限:
<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功能。代碼如下所示:
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"
注:
-
在運行以上代碼時,如果服務器端你創建的應用程序中已經存在GameScore數據表和相應的score、playerName、cheatMode字段,那么你此時添加的數據和數據類型也應該和服務器端的表結構一致,否則將保存數據失敗。
-
如果服務器端不存在GameScore數據表,那么Bmob將根據你第一次(也就是運行的以上代碼)保存的GameSocre對象在服務器為你創建此數據表並插入相應數據。
-
每個BmobObject對象都有幾個默認的鍵(數據列)是不需要開發者指定的,
objectId是每個保存成功數據的唯一標識符。createdAt和updatedAt代表每個對象(每條數據)在服務器上創建和最后修改的時間。這些鍵(數據列)的創建和數據內容是由服務器端自主來完成的。因此,使用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>