模块和存储库{ #android_sdk_modules_and_repositories }¶
D2 object is the entry point to interact with the SDK. The SDK forces the D2 object to be a singleton across the application.
Modules are the layer below D2. They act as a wrapper for related functionality. A module includes some related repositories and might expose some services and helpers.
存储库充当DB(在某些情况下为Web API)的外观。它们提供元数据的读取功能和数据的读/写功能。
处理返回类型:RxJava¶
SDK使用RxJava类(可观察,单个,可完成,可流动)作为所有方法的首选返回类型。选择RxJava类的原因主要有两个:
- 为了促进对返回对象的异步处理。 SDK中的大多数操作都很耗时,必须在辅助线程中执行。这些返回类型强制应用处理这种异步行为。
- **要通知进度。**元数据或数据同步之类的方法可能需要几分钟才能完成。从用户的角度来看,有进步感非常有帮助。
这并不意味着应用程序被迫在其代码中使用RxJava:它们仅被迫处理某些方法的异步行为。 SDK通常会公开每个方法的* blocking *版本。
例如,使用RxJava和AsyncTask的同一查询:
*使用RxJava *
d2.programModule().programs()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.get()
.subscribe(programs -> {}); //List<Program>
*使用AsyncTask *
new AsyncTask<Void, Void, List<Program>>() {
protected List<Program> doInBackground() {
return d2.programModule().programs().blockingGet();
}
protected void onPostExecute(List<Program> programs) {
}
}.execute();
访问数据库非常耗时,建议使用任何推荐的方法在单独的线程中执行此操作 方法。但是,涉及访问 Web API 的程序(例如登录、元数据或数据下载或上传)必须 在单独的线程中运行,否则Android会抛出错误。
查询建筑物¶
存储库提供了带有编译时验证的构建器语法,以访问资源。典型的查询由一些修饰符(过滤器,顺序,嵌套字段)组成,并以操作(获取,计数,getPaged等)结束。
// Generic syntax
d2.<module>.<repository>
.[ filter | orderBy | nested fields ]
.<action>;
// An example for events
d2.eventModule().events()
.byOrganisationUnitUid().eq("DiszpKrYNg8")
.byEventDate().after(Date("2019-05-05"))
.orderByEventDate(DESC)
.withTrackedEntityDataValues()
.get();
筛选器¶
Repositories expose the list of available filters prefixed by the keyword "by". The list of filter operators available for each filter is dependant on the filter value type: for example, a value type Date will offer operators like after, before, inPeriods, while a value type Boolean will offer isFalse or isTrue.
常见的过滤运算符包括 - Equality:eq()、notEq()- **比较**:gt()、lt()、ge()、le() - 字符串匹配:like()、notLike()- **集合**:in() - 匹配所提供列表中的任何值 - 空检查:isNull()、isNotNull()`
可以按任何顺序将多个过滤器附加到同一查询。过滤器使用运算符“ AND”全局连接。这意味着查询类似于
d2.eventModule().events()
.byOrganisationUnitUid().eq("DiszpKrYNg8")
.byEventDate().after(Date("2019-05-05"))
...
将返回分配给其“事件日期”在“ 2019-05-05”之后的组织单位“ DiszpKrYNg8” ** AND **的事件。
in()` 操作符对于同时查询多个值特别有用:
Java // 查询带有特定数据值的跟踪实体实例 d2.trackedEntityModule().trackedEntityInstanceQuery() .byDataValue("dataElementUid").in("value1", "value2", "value3") .onlineFirst() .get();
### 排序依据 { #android_sdk_order_by }
排序修饰符以关键字“ orderBy”为前缀。
可以将多个“ orderBy”修饰符附加到同一查询中。查询中“ orderBy”修饰符的顺序确定顺序优先级。这意味着查询类似于
```java
d2.eventModule().events()
.orderByEventDate(DESC)
.orderByLastUpdated(DESC)
...
将首先由EventDate后代排序,然后由LastUpdated后代排序。
包括嵌套字段¶
存储库返回的类与数据库表并不完全匹配:它们是更复杂的对象,可能包含从其他表中获取的某些属性。例如,"Event "类有一个名为 "trackedEntityDataValues "的属性,其中包括一个 TrackedEntityDataValues 列表。选择这类对象的主要原因是吸收处理链接表的复杂性,这样应用程序就不必关心在对象之间建立链接。
由于性能问题,默认情况下不包括此类属性:必须明确查询它们。在存储库中,默认情况下不包括且需要查询的属性以关键字“ with”为前缀。
几个属性可以按任何顺序附加到同一查询中。例如,类似
d2.programModule().programs()
.withTrackedEntityType()
...
将返回一个嵌套的 TrackedEntityType 对象。
帮手¶
The SDK include some helpers in the package org.hisp.dhis.android.core.arch.helpers. They can be easily found in Android Studio by searching Helper in class names. They include some helpful methods to perform common operations:
AccessHelper:与访问(共享设置)对象有关。CollectionsHelper:集合的常用操作。CoordinateHelper,GeometryHelper:地理空间数据操作。- FileResizeHelper"、"FileResourceDirectoryHelper":文件资源操作。
UidsHelper:带有uid的对象集合的常用操作。- UserHelper:与用户身份验证相关的操作。
- ValueType:不同值类型及其验证器的列表。
模块清单¶
系统模块:
- 导入模块
- 维护模块
- 系统信息模块
- 设置模块
- 数据存储模块
- 擦拭模块
大块模块:
- 元数据模块
- AggregatedDataModule
具体模块:
- 属性模块
- 类别模块
- 常量模块
- 数据元素模块
- 数据集模块
- dataValueModule
- 注册模块
- 事件模块
- 文件资源模块
- 指示器模块
- 图例集模块
- 备注模块
- OrganisationUnitModule
- 选项模块
- 周期模块
- 程序模块
- 关系模块
- 短信模块
- 跟踪实体模块
- 用户模块
- 验证模块