【发布时间】: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 中使用相同的查询会返回正确且所需的数据。
这是存储的数据(正确)
这是此时返回的 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