跳转至
For the complete DHIS2 documentation index, see llms.txt.

直接数据库交互{ #android_sdk_database_interaction }

存储库方法满足了应用程序的大多数需求。但是在某些情况下,应用程序可能希望直接与数据库进行交互。

SDK 公开了一个 DatabaseAdapter 对象,用于在数据库中执行原始 SQL 语句。自从迁移到 Room Database 后,API 使用了挂起函数,并以映射列表(而不是游标)的形式返回结果。

可用方法{ #available-methods }

数据库适配器提供了几种直接与数据库交互的方法:

  • rawQuery(sqlQuery: String, queryArgs: Array<Any>?):执行 SQL 查询,并以 List<Map<String, String?>> 的形式返回结果。所有值都以字符串形式返回。
  • rawQueryWithTypedValues(sqlQuery: String, queryArgs: Array<Any>?):与 rawQuery 类似,但返回带有类型值的 List<Map<String, Any?>>
  • delete(tableName: String, whereClause: String?, whereArgs: Array<Any>?):删除表中的行,并返回受影响行的数量。
  • execSQL(sql: String):执行 SQL 语句,不返回结果。
  • setForeignKeyConstraintsEnabled(enabled: Boolean):启用或禁用外键约束。

TableInfo 类{ #tableinfo-classes }

SDK 会自动为每个房间实体生成 TableInfo 类。这些类提供了对表和列名称的类型安全访问,避免了在查询中使用硬编码字符串。

例如,"ConstantTableInfo "类由 "ConstantDB "实体生成:

导入 org.hisp.dhis.android.persistence.constant.ConstantTableInfo

// 访问表名
val tableName = ConstantTableInfo.TABLE_NAME // "常量"。

// 访问列名
val uidColumn = ConstantTableInfo.Columns.UID // "uid" = "uid"。
val nameColumn = ConstantTableInfo.Columns.NAME // "name" ("名称")
val valueColumn = ConstantTableInfo.Columns.VALUE // "value" (值)

示例:读取常量{ #example-reading-constants }

``kotlin // 使用资源库 val constants = d2.constantModule().constants().blockingGet() // 列表

// 使用 TableInfo 与 rawQuery 直接进行数据库交互 val query = "SELECT * FROM ${ConstantTableInfo.TABLE_NAME}" val results = runBlocking { d2.databaseAdapter().rawQuery(query, null) }

// 处理结果--每一行都是一个 Map val constantList = results.map { row -> constant.builder() constant.builder() .uid(row[ConstantTableInfo.Columns.UID]) .code(row[ConstantTableInfo.Columns.CODE]) .name(row[ConstantTableInfo.Columns.NAME]) .displayName(row[ConstantTableInfo.Columns.DISPLAY_NAME]) .value(row[ConstantTableInfo.Columns.VALUE]?.toDoubleOrNull()) .build() }

## 示例:使用查询参数{ #example-using-query-parameters } 

``kotlin
// 带参数查询以防止 SQL 注入
val query = "SELECT * FROM ${ConstantTableInfo.TABLE_NAME}WHERE ${ConstantTableInfo.Columns.UID} = ?"
val results = runBlocking {
    d2.databaseAdapter().rawQuery(query, arrayOf("constantUid"))
}

示例:删除记录{ #example-deleting-records }

``kotlin // 使用 TableInfo 删除特定记录 val deletedRows = runBlocking { d2.databaseAdapter().delete( tableName = ConstantTableInfo.TABLE_NAME、 whereClause = "${ConstantTableInfo.Columns.UID} = ?"、 whereArgs = arrayOf("constantUid") ) } ```

重要说明{ #important-notes }

  • 所有数据库操作都是 ** 挂起函数**,必须从例程上下文或使用 runBlocking 调用。
  • 使用 TableInfo 以类型安全的方式访问表和列名称。这些类由 Room 实体(如 ConstantTableInfoEventTableInfoDataElementTableInfo)自动生成。
  • 表名对应于房间数据库模式中的 @Entity 注释(例如,"常量""事件""数据元素")。
  • 查询参数支持多种类型:字符串"、"长"、"英特"、"双"、"浮点数"、"布尔"、"字节数组 "和 "空"。
  • 使用参数化查询(带?占位符)防止 SQL 注入攻击。
  • TableInfo "类与其对应的实体(如 "org.hisp.dhis.android.persistence.constant.ConstantTableInfo")位于同一个包中。