Android Room Persistent库更新不起作用

时间:2019-02-21 14:08:42

标签: android kotlin android-room

我在新的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)

问题是会话的属性值,例如repetitionsCompletedfinishingRepetitionsCompleted似乎没有保存,并且在我重新启动应用程序时始终保持为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)

}

奇怪的是,更新似乎在我的单元测试中起作用,但在实际的应用程序代码中却无效。

我不知道这是否会影响事情,但是我正在服务中运行它。

2 个答案:

答案 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)