Android 房间 - 使用 WHERE 条件进行查询时出现问题

Android Room - Issue with query with WHERE condition

@Query("delete from " + DatabaseConstant.mSyncAllDataTable + " WHERE id < :idLimit AND tableName = " + DatabaseConstant.mUserBatteryDetailsTable)
suspend fun deleteSyncedBatteryDetailsData(idLimit: Int)

DatabaseConstant.mUserBatteryDetailsTable 是“电池详细信息”

下面是 SyncAllData

的条目
@Entity(tableName = DatabaseConstant.mSyncAllDataTable)
data class SyncAllData(
        @PrimaryKey(autoGenerate = true)
        val id: Int = 0,
        val tableName: String,
        val jsonData: String
)

调用上述方法时出现以下错误:

error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: batteryDetails)
public abstract java.lang.Object deleteSyncedBatteryDetailsData(int idLimit, @org.jetbrains.annotations.NotNull()

可能是什么问题?如您所见,实体包含列名“tableName”。

使用 ' 引号,否则将被视为 identifier。 在这里引用文档以供参考:

If you want to use a keyword as a name, you need to quote it. There are four ways of quoting keywords in SQLite:

'keyword'       A keyword in single quotes is a string literal.
"keyword"       A keyword in double-quotes is an identifier.
[keyword]       A keyword enclosed in square brackets is an identifier. This is not standard SQL. This quoting mechanism is used by MS Access and SQL Server and is included in SQLite for compatibility.
`keyword`       A keyword enclosed in grave accents (ASCII code 96) is an identifier. This is not standard SQL. This quoting mechanism is used by MySQL and is included in SQLite for compatibility.

因此您需要将查询修改为:

@Query("delete from " + DatabaseConstant.mSyncAllDataTable + " WHERE id < :idLimit AND tableName = '" + DatabaseConstant.mUserBatteryDetailsTable + "'")