name: bmob-database-android description: "Use when implementing Bmob NoSQL database CRUD in an Android Native project (Java or Kotlin). Triggers: io.github.bmob:android-sdk, Bmob.initialize(this, ...), BmobObject, BmobQuery, BmobUser, BmobInstallation, BmobFile, BmobRelation, BmobGeoPoint, BmobDate, SaveListener, UpdateListener, FindListener, QueryListener, BmobException, BmobContentProvider, AndroidManifest Bmob 配置. NOT for cross-platform JavaScript / WeChat Mini Program / Cocos Creator JS (use bmob-database-javascript), iOS / Swift (use bmob-database-ios), Flutter / Dart (use bmob-database-flutter), or raw HTTP from any other language (use bmob-database-restful). If Bmob MCP is configured, call get_project_tables via bmob-mcp before writing code." metadata: author: bmob version: "0.1.0" sdk: "io.github.bmob:android-sdk" docs: "https://github.com/bmob/BmobDocs/blob/master/mds/data/android/develop_doc.md" docs_raw: "https://raw.githubusercontent.com/bmob/BmobDocs/master/mds/data/android/develop_doc.md" docs_quickstart: "https://github.com/bmob/BmobDocs/blob/master/mds/data/android/index.md" quickstart_repo: "https://github.com/bmob/bmob-android-quickstart"
Bmob 為 Android 原生提供 Java/Kotlin SDK,釋出在 Maven 倉庫 io.github.bmob:android-sdk。模型層用 繼承 BmobObject 的方式(一個 JavaBean 子類 = 一張表),CRUD 通過 SDK 提供的 Listener 回撥返回。
1. SDK 引入: app/build.gradle 新增:
dependencies {
implementation 'io.github.bmob:android-sdk:4.2.1'
implementation 'io.reactivex.rxjava3:rxjava:3.1.9'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
implementation 'com.squareup.okhttp3:okhttp:4.8.1'
implementation 'com.squareup.okio:okio:2.2.2'
implementation 'com.google.code.gson:gson:2.8.5'
}
2. Application 子類初始化: 一次性、必須在任何 Bmob 呼叫之前。
public class BmobApp extends Application {
@Override public void onCreate() {
super.onCreate();
Bmob.initialize(this, "你的Application ID");
}
}
AndroidManifest.xml 裡指定 android:name=".BmobApp"。
3. 必備許可權與 ContentProvider: 詳見 references/manifest-and-deps.md(INTERNET / ACCESS_NETWORK_STATE / READ_PHONE_STATE / <provider> 等)。
4. JavaBean 繼承 BmobObject: 表名 = 類名,欄位名 = 成員變數名。不要手動寫 objectId / createdAt / updatedAt / ACL,BmobObject 已經提供 getter。
5. Number 欄位必須用封裝類(Integer / Long / Double 等),不要用原生 int / long / double,否則儲存時無法區分預設值。
6. Android 6.0+ 網路相容:見 references/manifest-and-deps.md 的 useLibrary 'org.apache.http.legacy' 與 network_security_config.xml。
Bmob.setIsDebug(true) 僅 debug 構建開啟。references/manifest-and-deps.md 的 ProGuard 段。Bmob.resetDomain("http://你的SDK域名/8/") 必須在 Bmob.initialize 之前。0 與"未設定"無法區分。跨平臺 Q&A:shared/faq.md。
見 shared/anti-patterns.md。本端重點:success 回撥內未捕獲異常 → 假 9015;勿用原生 int 存 Number。
public class Category extends BmobObject {
private String name;
private String desc;
private Integer sequence; // 必須是 Integer,不是 int
public String getName() { return name; }
public Category setName(String name) { this.name = name; return this; }
public String getDesc() { return desc; }
public Category setDesc(String desc) { this.desc = desc; return this; }
public Integer getSequence() { return sequence; }
public Category setSequence(Integer sequence) { this.sequence = sequence; return this; }
}
| 控制台型別 | Java 型別 |
|---|---|
| String | String |
| Boolean | Boolean |
| Number | Integer / Long / Double / Float / Short / Byte / Character |
| Array | List |
| File | BmobFile |
| GeoPoint | BmobGeoPoint |
| Date | BmobDate |
| Pointer | 任何繼承 BmobObject 的子類 |
| Relation | BmobRelation |
Category c = new Category();
c.setName("football");
c.setDesc("足球");
c.setSequence(1);
c.save(new SaveListener<String>() {
@Override public void done(String objectId, BmobException e) {
if (e == null) Log.i("BMOB", "new id=" + objectId);
else Log.e("BMOB", e.toString());
}
});
Category c = new Category();
c.setSequence(2); // 只設要改的欄位
c.update("6b6c11c537", new UpdateListener() {
@Override public void done(BmobException e) {
if (e == null) Log.i("BMOB", "updated");
}
});
Category c = new Category();
c.delete("6b6c11c537", new UpdateListener() {
@Override public void done(BmobException e) {
if (e == null) Log.i("BMOB", "deleted");
}
});
BmobQuery<Category> q = new BmobQuery<>(); q.getObject("6b6c11c537", new QueryListener<Category>() { @Override public void done(Category obj, BmobException e) { if (e == null) Log.i("BMOB", obj.getName()); } });7w4.net提供免費和付費技能下載。
BmobQuery 提供鏈式呼叫(v3.5.2+):
BmobQuery<Book> q = new BmobQuery<>();
q.setLimit(20).setSkip(0).order("-createdAt")
.addWhereEqualTo("status", "published")
.findObjects(new FindListener<Book>() {
@Override public void done(List<Book> list, BmobException e) {
if (e == null) /* ... */;
}
});
| 方法 | 含義 |
|---|---|
addWhereEqualTo(field, value) |
= |
addWhereNotEqualTo |
!= |
addWhereGreaterThan / addWhereGreaterThanOrEqualTo |
> / >= |
addWhereLessThan / addWhereLessThanOrEqualTo |
< / <= |
addWhereContainedIn(field, List) |
IN |
addWhereNotContainedIn |
NOT IN |
addWhereExists(field) / addWhereDoesNotExists |
欄位存在 / 不存在 |
addWhereContains(field, substr) |
LIKE(付費) |
order("-field") / order("field") |
排序 |
setLimit(n) / setSkip(n) |
分頁(預設 10,最大 1000) |
include("pointerField") |
一併拉取 Pointer |
更多見 references/query.md。
List<BmobObject> list = new ArrayList<>();
for (int i = 0; i < 50; i++) {
Category c = new Category();
c.setName("name" + i);
list.add(c);
}
new BmobBatch().insertBatch(list).doBatch(new QueryListListener<BatchResult>() {
@Override public void done(List<BatchResult> results, BmobException e) { /* ... */ }
});
如已配置 Bmob MCP,先 get_project_tables 拿真實 schema,再生成對應的 BmobObject 子類骨架。這能避免:
跨平臺現象先查 shared/faq.md。
| 現象 | 排查 |
|---|---|
9001 AppKey is Null |
沒調 Bmob.initialize 或呼叫時機晚於其他 SDK API |
9013 ObjectName format incorrect |
表名 / 欄位名含非法字元(必須字母開頭) |
9015 |
兜底錯誤碼——必讀響應描述,可能是 success 回撥裡業務異常被吞掉,見 bmob-error-codes 的 9015 專題 |
9016 |
客戶端沒網 |
9021 |
缺 WAKE_LOCK 許可權 |
| ProGuard release 後崩潰 | 沒加 -keep class cn.bmob.v3.** { *; } 等規則,詳見 references |
| HTTP 明文請求被 Android P 拒絕 | 加 network_security_config.xml,見 references |
release 包請求被拒 / 403 |
控制台沒配 SDK 型別的備案域名;Bmob.resetDomain 沒調或呼叫時機錯(必須在 initialize 前) |
| 主題 | 路徑 |
|---|---|
| 端到端場景(部落格、Todo ACL、遷移等) | shared/recipes/ |
| BmobDocs 同步程式碼片段 | references/snippets/ |
| Manifest + 依賴 + ProGuard + Android P/6.0 相容 | references/manifest-and-deps.md |
| 批次操作(insert/update/delete 各 50/批) | references/batch.md |
| 查詢全集(or / regex / pointer 子查詢) | references/query.md |
| Pointer 與 Relation 用法 | references/pointer-and-relation.md |
| 使用者系統、郵箱、手機號 SMS、第三方登入 | (P1: bmob-auth-android,本 skill 不細寫) |
| 檔案上傳 / 下載(BmobFile) | (P1: bmob-storage-android) |
| 資料監聽(即時資料) | (P1: bmob-realtime-android) |
| 地理位置(BmobGeoPoint) | references/query.md 末段 |
bmob-error-codesbmob-mcp這是一份較為實用的Bmob Android開發參考指南,內容覆蓋面廣,程式碼示例豐富,安全性提示也比較到位。文件結構清晰,從入門到高階查詢都有涉及,對Android開發環境的配置說明也比較詳細。美中不足的是示例僅提供Java程式碼,且部分內容組織稍顯零散。對於想快速上手Bmob資料庫開發的Android程式設計師來說,這個Skill能提供有效的幫助,但需要一定的Android和Java基礎。