版本要求
- Android 2.3+
配置
- 将需要的包加入项目
- 在根目录下的
build.gradle
里加如下两段代码- 申明Gradle仓库地址
allprojects { repositories { maven { url "https://jitpack.io" } } }
- 申明Gradle的依赖
dependencies { compile 'com.github.delight-im:Android-DDP:v3.1.2' }
- 申明Gradle仓库地址
- 在根目录下的
- 在
AndroidManifest.xml
中添加许可:<uses-permission android:name="android.permission.INTERNET" />
使用
- 创建
DDP client
实例public class MyActivity extends Activity implements MeteorCallback { private Meteor mMeteor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 创建一个实例 mMeteor = new Meteor(this, "ws://example.meteor.com/websocket"); // 注册回调函数 mMeteor.addCallback(this); // 建立连接 mMeteor.connect(); } public void onConnect(boolean signedInAutomatically) { } public void onDisconnect() { } public void onDataAdded(String collectionName, String documentID, String newValuesJson) { // 自行解析json数据 (不推荐) // 或者 // 直接用数据库语句操作 (后面会有详细介绍) (推荐) } public void onDataChanged(String collectionName, String documentID, String updatedValuesJson, String removedValuesJson) { // 自行解析json数据 (不推荐) // 或者 // 直接用数据库语句操作 (后面会有详细介绍) (推荐) } public void onDataRemoved(String collectionName, String documentID) { // 自行解析json数据 (不推荐) // 或者 // 直接用数据库语句操作 (后面会有详细介绍) (推荐) } public void onException(Exception e) { } @Override public void onDestroy() { mMeteor.disconnect(); mMeteor.removeCallback(this); // or // mMeteor.removeCallbacks(); // ... super.onDestroy(); } }
- 单例模式
- 在一开始就创建一个实例
MeteorSingleton.createInstance(this, "ws://example.meteor.com/websocket") // 代替 // new Meteor(this, "ws://example.meteor.com/websocket")
- 实例可以直接用 (通过
Activity
实例)MeteorSingleton.getInstance() // 代替 // mMeteor
- 所有API方法都可以通过
MeteorSingleton.getInstance()
调用。
- 在一开始就创建一个实例
- 注册一个回调函数
// MeteorCallback callback; mMeteor.addCallback(callback);
- 取消一个回调函数
mMeteor.removeCallbacks(); // or // // MeteorCallback callback; // mMeteor.removeCallback(callback);
- 向 collection 中添加数据
Map<String, Object> values = new HashMap<String, Object>(); values.put("_id", "my-id"); values.put("some-key", "some-value"); mMeteor.insert("my-collection", values); // or // mMeteor.insert("my-collection", values, new ResultListener() { });
- 更新 collection 中的数据
Map<String, Object> query = new HashMap<String, Object>(); query.put("_id", "my-id"); Map<String, Object> values = new HashMap<String, Object>(); values.put("some-key", "some-value"); mMeteor.update("my-collection", query, values); // or // mMeteor.update("my-collection", query, values, options); // or // mMeteor.update("my-collection", query, values, options, new ResultListener() { });
- 删除 collection 中的数据
mMeteor.remove("my-collection", "my-id"); // or // mMeteor.remove("my-collection", "my-id", new ResultListener() { });
- 从后端订阅数据
String subscriptionId = mMeteor.subscribe("my-subscription"); // or // String subscriptionId = mMeteor.subscribe("my-subscription", new Object[] { arg1, arg2 }); // or // String subscriptionId = mMeteor.subscribe("my-subscription", new Object[] { arg1, arg2 }, new SubscribeListener() { });
- 取消订阅
mMeteor.unsubscribe(subscriptionId); // or // mMeteor.unsubscribe(subscriptionId, new UnsubscribeListener() { });
- 调用后端自定义的方法
mMeteor.call("myMethod"); // or // mMeteor.call("myMethod", new Object[] { arg1, arg2 }); // or // mMeteor.call("myMethod", new ResultListener() { }); // or // mMeteor.call("myMethod", new Object[] { arg1, arg2 }, new ResultListener() { });
- 与后端断开连接
mMeteor.disconnect();
- 创建新账户 (后端依赖包
accounts-password
)mMeteor.registerAndLogin("john", "john.doe@example.com", "password", new ResultListener() { }); // or // mMeteor.registerAndLogin("john", "john.doe@example.com", "password", profile, new ResultListener() { });
- 通过 username 登录 (依赖后端包
accounts-password
)mMeteor.loginWithUsername("john", "password", new ResultListener() { });
- 通过邮箱登录 (依赖后端包
accounts-password
)mMeteor.loginWithEmail("john.doe@example.com", "password", new ResultListener() { });
- 检查是否已经登录 (依赖后端包
accounts-password
)mMeteor.isLoggedIn();
- 获取 user ID (前提是已登录) (依赖后端包
accounts-password
)mMeteor.getUserId();
- 登出 (依赖后端包
accounts-password
)mMeteor.logout(); // or // mMeteor.logout(new ResultListener() { });
- 检查客户端是否连接
mMeteor.isConnected();
- 手动重连 (一般不需要)
mMeteor.reconnect();
利用数据库语句处理数据
配置数据库
InMemoryDatabase
是 Database
实例的唯一子类,代码如下:
mMeteor = new Meteor(this, "ws://example.meteor.com/websocket", new InMemoryDatabase());
此时,所有数据都自动从后端接收,并解析完成存入数据库。不需要手动解析JSON!
接收数据时,注意一些状态, onDataAdded
, onDataChanged
or onDataRemoved
。
访问数据库
Database database = mMeteor.getDatabase();
这些和后续的方法,都支持链式调用。
通过集合名从数据库获取集合
// String collectionName = "myCollection";
Collection collection = mMeteor.getDatabase().getCollection(collectionName);
获取数据库中所有的集合名字
String[] collectionNames = mMeteor.getDatabase().getCollectionNames();
获取数据库中集合数量
int numCollections = mMeteor.getDatabase().count();
通过ID从集合中取数据
// String documentId = "wjQvNQ6sGjzLMDyiJ";
Document document = mMeteor.getDatabase().getCollection(collectionName).getDocument(documentId);
获取集合中所有数据的ID
String[] documentIds = mMeteor.getDatabase().getCollection(collectionName).getDocumentIds();
获取集合中数据数量
int numDocuments = mMeteor.getDatabase().getCollection(collectionName).count();
在集合中查找数据
以下所有方法都支持链式调用,并随意组合。
// String fieldName = "age";
// int fieldValue = 62;
Query query = mMeteor.getDatabase().getCollection(collectionName).whereEqual(fieldName, fieldValue);
// String fieldName = "active";
// int fieldValue = false;
Query query = mMeteor.getDatabase().getCollection(collectionName).whereNotEqual(fieldName, fieldValue);
// String fieldName = "accountBalance";
// float fieldValue = 100000.00f;
Query query = mMeteor.getDatabase().getCollection(collectionName).whereLessThan(fieldName, fieldValue);
// String fieldName = "numChildren";
// long fieldValue = 3L;
Query query = mMeteor.getDatabase().getCollection(collectionName).whereLessThanOrEqual(fieldName, fieldValue);
// String fieldName = "revenue";
// double fieldValue = 0.00;
Query query = mMeteor.getDatabase().getCollection(collectionName).whereGreaterThan(fieldName, fieldValue);
// String fieldName = "age";
// int fieldValue = 21;
Query query = mMeteor.getDatabase().getCollection(collectionName).whereGreaterThanOrEqual(fieldName, fieldValue);
// String fieldName = "address";
Query query = mMeteor.getDatabase().getCollection(collectionName).whereNull(fieldName);
// String fieldName = "modifiedAt";
Query query = mMeteor.getDatabase().getCollection(collectionName).whereNotNull(fieldName);
Document[] documents = mMeteor.getDatabase().getCollection(collectionName).find();
// int limit = 30;
Document[] documents = mMeteor.getDatabase().getCollection(collectionName).find(limit);
// int limit = 30;
// int offset = 5;
Document[] documents = mMeteor.getDatabase().getCollection(collectionName).find(limit, offset);
Document document = mMeteor.getDatabase().getCollection(collectionName).findOne();
可以组合到一起,如下:
Document document = mMeteor.getDatabase().getCollection("users").whereNotNull("lastLoginAt").whereGreaterThan("level", 3).findOne();
通过属性名查找属性
// String fieldName = "age";
Object field = mMeteor.getDatabase().getCollection(collectionName).getDocument(documentId).getField(fieldName);
获取所有属性名
String[] fieldNames = mMeteor.getDatabase().getCollection(collectionName).getDocument(documentId).getFieldNames();
获取属性数量
int numFields = mMeteor.getDatabase().getCollection(collectionName).getDocument(documentId).count();