直接数据库交互{ #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## 示例:使用查询参数{ #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 实体(如ConstantTableInfo、EventTableInfo、DataElementTableInfo)自动生成。 - 表名对应于房间数据库模式中的
@Entity注释(例如,"常量"、"事件"、"数据元素")。 - 查询参数支持多种类型:字符串"、"长"、"英特"、"双"、"浮点数"、"布尔"、"字节数组 "和 "空"。
- 使用参数化查询(带
?占位符)防止 SQL 注入攻击。 - TableInfo "类与其对应的实体(如 "org.hisp.dhis.android.persistence.constant.ConstantTableInfo")位于同一个包中。