我正在尝试实现以下方案 – >记录从API获取并存储到DB中.有些记录可能会被点击为收藏,即使从API获取新数据,它们仍应保持这样.但是,我似乎找不到如何在不替换整行的情况下替换那些已经被选为收藏的记录的方法.我已经尝试逐个插入记录,并以某种方式在插入检查是否已经存在记录,但我似乎无法用RxJava来解决它.
道
@Dao
interface KafanaDao {
@Insert
fun insertSingleKafana(kafana: Kafana)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(kafani: List)
@Query("SELECT * FROM ${Constants.KAFANI_TABLE_NAME}")
fun getKafani(): Single>
@Query("SELECT * FROM ${Constants.KAFANI_TABLE_NAME} WHERE name = :name")
fun getSingleKafana(name: String): Single
@Query("UPDATE ${Constants.KAFANI_TABLE_NAME} SET isFavorite = :isFavorite WHERE name = :name")
fun setFavourite(name: String, isFavorite: Int)
}
然后我一个接一个地插入记录,但是如何检查它们是否已经存储在数据库中?
fun insertSingleKafanaInDb(kafana: Kafana) {
Observable.fromCallable { kafanaDao.insertSingleKafana(kafana) }
.subscribeOn(Schedulers.io())
.subscribe {
Timber.d("Inserted ${kafana.name} kafani from API in DB...")
}
}
fun getKafaniFromApi(): Observable> {
return apiService.getKafani().toObservable().doOnNext {
for (kafana in it) {
//I need to somehow do the check here
insertSingleKafanaInDb(kafana)
}
}
}
实体
@Entity(tableName = Constants.KAFANI_TABLE_NAME)
data class Kafana(
@PrimaryKey
@ColumnInfo(name = "name")
@SerializedName("name")
val name: String,
@ColumnInfo(name = "phone")
@SerializedName("phone")
val phone: String,
@ColumnInfo(name = "address")
@SerializedName("address")
val address: String,
@ColumnInfo(name = "city")
@SerializedName("city")
val city: String,
@ColumnInfo(name = "sponsored")
@SerializedName("sponsored")
val isSponsored: Boolean,
@ColumnInfo(name = "isFavorite")
var isFavorite: Boolean
)
解决方法:
可以通过两种方法完成
第一:-
在插入Kafane之前,你查询getSingleKafana(name:String):单一并从数据库中获取它,如果它可用并获得最喜欢的状态并将此喜欢的字段设置为新来自API的KAFANA对象.
第二个:
做一个查询,它将返回带有收藏夹的KAFANA对象列表为真,结果将为List,在从API检查插入新KAFANA之前,kafana将显示在List中.
房间不支持任何条件插入查询.它将插入整个对象.
标签:android,kotlin,android-room
来源: https://codeday.me/bug/20190522/1153346.html