我正在学习室并创建:
@Entity
data class Result(
@PrimaryKey(autoGenerate = true) var rId: Long,
var title: String?,
var url: String?,
@Ignore val multimedia: List<Multimedia>?
) {
constructor(rId: Long, title: String?, url: String?) : this(rId, title, url, null)
@Dao
interface ResultDao {
@Transaction
@Query("SELECT * FROM Result")
fun getResults(): List<ResultWithMultimedia>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertResults(results: List<Result>): Completable
}
}
@Entity
data class Multimedia(
@PrimaryKey(autoGenerate = true) val mId: Long,
val resultId: Long,
val url: String?,
val caption: String?
)
结果和多媒体也是翻新的模型。 json响应包含多媒体属性。我按照https://developer.android.com/training/data-storage/room/relationships#one-to-many尝试尝试并保持结果。这是一个相同的示例,结果基本上是“用户”,而多媒体基本上是“播放列表”。我创建了:
data class ResultWithMultimedia(
@Embedded var result: Result,
@Relation(
parentColumn = "rId",
entityColumn = "mId"
)
var multimedia: List<Multimedia>
)
我尝试使用“ resultDao.insertResults(resultList)”插入列表,但似乎没有任何持久性。我正在使用以下方法获得结果:
private fun getDatabaseResults(): Single<List<Result>?> {
return Single.defer {
Single.just(
resultDao.getResults().map {
Result(it.result.rId, it.result.title, it.result.url, it.multimedia)
}.toList()
)
}
}
我的数据库文件:
@Database(version = 1, entities = [Result::class, Multimedia::class])
abstract class ResultsDatabase: RoomDatabase() {
abstract fun resultDao(): Result.ResultDao
companion object {
@Volatile private var INSTANCE: ResultsDatabase? = null
fun getInstance(context: Context): ResultsDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(
context.applicationContext,
ResultsDatabase::class.java,
"Results.db").build()
}
}
Completable
的结果是什么。我认为,如果未插入任何内容,则表示有错误,并且会抛出onFail
的Completable
。