【问题标题】:Room Livedata returns incorrect valuesRoom Livedata 返回不正确的值
【发布时间】:2020-03-16 14:11:02
【问题描述】:

我有一个录音机应用程序,用户可以在其中使用预定义的标记标记其录音中的某些点。为此,我有一个 MarkerEntity,它是 Marker 的类型,以及一个 MarkTimestamp,用户标记给定记录的点。这些实体通过称为 MarkAndTimestamp 的关系连接。

@Entity(tableName = "markerTable")
data class MarkerEntity(
    @PrimaryKey(autoGenerate = true) val uid: Int,
    @ColumnInfo(name = "markerName") val markerName: String
)

@Entity(tableName = "markerTimeTable")
data class MarkTimestamp(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "mid") val mid: Int,
    @ColumnInfo(name = "recordingId") val recordingId: Int,
    @ColumnInfo(name = "markerId") val markerId: Int,
    @ColumnInfo(name = "markTime") val markTime: String
)

data class MarkAndTimestamp(
    @Embedded val marker: MarkerEntity,
    @Relation(
        parentColumn = "uid",
        entityColumn = "markerId"
    )
    val markTimestamp: MarkTimestamp
)

这些数据的插入完美无缺,我通过 DB Browser for SQLite 和 Android Debug Database 检查了这一点。当我想显示记录的所有标记时,问题就出现了。我使用以下 SQL 语句获取条目。

@Transaction
@Query("SELECT * FROM markerTimeTable INNER JOIN markerTable ON markerTimeTable.markerId=markerTable.uid WHERE markerTimeTable.recordingId = :key")
fun getMarksById(key: Int): LiveData<List<MarkAndTimestamp>>

最终发生的情况是,如果用户多次使用标记,则使用该标记创建的所有标记都附加了相同的 MarkerTimestamp 行,特别是要插入该标记的最后一行。奇怪的是,这只发生在使用 Livedata 的应用程序中。在 SQLite 的 DB Browser 中使用相同的查询会返回正确且所需的数据。

这是存储的数据(正确)

MarkTimestamps

MarkerEntities

这是此时返回的 Livedata(不正确)

[
MarkAndTimestamp(marker=MarkerEntity(uid=1, markerName=Mark), markTimestamp=MarkTimestamp(mid=6, recordingId=2, markerId=1, markTime=00:05)),
MarkAndTimestamp(marker=MarkerEntity(uid=2, markerName=zwei), markTimestamp=MarkTimestamp(mid=5, recordingId=2, markerId=2, markTime=00:03)),
MarkAndTimestamp(marker=MarkerEntity(uid=1, markerName=Mark), markTimestamp=MarkTimestamp(mid=6, recordingId=2, markerId=1, markTime=00:05))
]

我还收到以下构建警告

warning: The query returns some columns [mid, recordingId, markerId, markTime] which are not used by de.ur.mi.audidroid.models.MarkAndTimestamp. You can use @ColumnInfo annotation on the fields to specify the mapping.  You can suppress this warning by annotating the method with @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH). Columns returned by the query: mid, recordingId, markerId, markTime, uid, markerName. Fields in de.ur.mi.audidroid.models.MarkAndTimestamp: uid, markerName. - getMarksById(int) in de.ur.mi.audidroid.models.MarkerDao

为什么 Room 返回错误的数据,我该如何解决?

【问题讨论】:

    标签: android sql android-room android-livedata


    【解决方案1】:

    所以,我仍然不知道是什么导致了我原来帖子中描述的行为。我的猜测是,realtion 数据类和 SQL 查询以某种方式干扰,产生了令人困惑和不正确的结果。

    我还是解决了我的问题。我需要改变

    data class MarkAndTimestamp(
        @Embedded val marker: MarkerEntity,
        @Relation(
            parentColumn = "uid",
            entityColumn = "markerId"
        )
        val markTimestamp: MarkTimestamp
    )
    

    data class MarkAndTimestamp(
        @Embedded val marker: MarkerEntity,
        @Embedded val markTimestamp: MarkTimestamp
    )
    

    这确保查询返回的所有字段都包含在数据类中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2016-10-09
      相关资源
      最近更新 更多