我在新的Android应用中使用room
,并且尝试在运行时更新模型对象的属性,但似乎没有得到保存。
实体
@Entity(tableName = "sessions")
data class Session(@ColumnInfo(name="id") @PrimaryKey(autoGenerate = true) var id: Int = 0,
@ColumnInfo(name="date") var date: Date,
@ColumnInfo(name="repetitions_completed") var repetitionsCompleted: Int,
@ColumnInfo(name="squeeze_time_per_rep") var squeezeTimePerRep: Int,
@ColumnInfo(name="finishing_repetitions_completed") var finishingRepetitionsCompleted: Int,
@ColumnInfo(name="finishing_squeeze_time_per_rep") var finishingSqueezeTimePerRep: Int)
在我的应用中,我像这样使用它
session = Session(0,date,0,slowSeconds,0,quickSeconds)
sessionDao.insertAll(sessionDB)
...
session.repetitionsCompleted = totalSlowReps
session.finishingRepetitionsCompleted = totalQuickReps
sessionDao.updateSessions(session)
问题是会话的属性值,例如repetitionsCompleted
和finishingRepetitionsCompleted
似乎没有保存,并且在我重新启动应用程序时始终保持为0。 updateSessions
还会返回0
这是道的代码
@Dao
interface SessionDao {
// https://developer.android.com/training/data-storage/room/accessing-data#query-params
@Query("SELECT * FROM sessions")
fun getAll(): List<Session>
@Query("SELECT * FROM sessions WHERE date BETWEEN :from AND :to")
fun getSessionsBetween(from: Date, to: Date): List<Session>
@Query("SELECT * FROM sessions ORDER BY date LIMIT 1")
fun getOldestSession(): List<Session>
@Update
fun updateSessions(vararg sessions: Session) : Int
@Insert
fun insertAll(vararg sessions: Session)
}
奇怪的是,更新似乎在我的单元测试中起作用,但在实际的应用程序代码中却无效。
我不知道这是否会影响事情,但是我正在服务中运行它。
答案 0 :(得分:0)
我发现问题是,当我创建session
对象时,对象返回的id
设置为0,而不是其autoGenerate主键,所以我所做的就是更改insert
返回插入的ID
@Insert
fun insertAll(vararg sessions: Session) : List<Long>
创建会话时,我会手动重新分配其ID
sessionDB = Session(0,date,0,slowSeconds,0,quickSeconds)
val insertID = sessionDao.insertAll(sessionDB).first().toInt()
sessionDB.id = insertID
答案 1 :(得分:0)
也许这听起来有点愚蠢,但它解决了我的问题。我想你们都熟悉 OnConflictStrategy
。为插入设置策略是有意义的。但 google 需要此策略用于 @Update
以及默认策略是 ABORT。
@return 如何处理冲突。默认为 {@link OnConflictStrategy#ABORT}。
所以解决方案是。
@Update(onConflict = OnConflictStrategy.REPLACE)