让我先显示一些代码。我在数据库中有症状对象的列表:
val symptomA = Symptom(id = 0, name = "SymptomA")
val symptomB = Symptom(id = 1, name = "SymptomB")
val symptomC = Symptom(id = 2, name = "SymptomC")
val symptomD = Symptom(id = 3, name = "SymptomD")
我还在数据库中列出了疾病对象:
val diseaseA = Disease(id = 0, name = "DiseaseA", listOfSymptoms = listOf(0, 1))
val diseaseB = Disease(id = 1, name = "DiseaseB", listOfSymptoms = listOf(1, 2, 3))
val diseaseC = Disease(id = 2, name = "DiseaseC", listOfSymptoms = listOf(0, 2))
val diseaseD = Disease(id = 3, name = "DiseaseD", listOfSymptoms = listOf(3))
我正在使用的一些类:
疾病
@Entity(tableName = "diseases")
data class Disease(
@PrimaryKey @NotNull val id: Int,
@NotNull val name: String,
@ColumnInfo(name = "symptoms_ids") val symptomsIds: String,
...)
症状道
@Dao
interface DiseaseDao {
@Query("SELECT * FROM diseases WHERE id LIKE :id LIMIT 1")
fun getDisease(id: Int): Disease
@Query("SELECT * FROM diseases")
fun getAllDiseases(): LiveData<List<Disease>>
@Query("SELECT * FROM diseases WHERE symptoms_ids IN (:symptoms)")
fun getDiseasesWithSymptoms(symptoms: List<Int>): LiveData<List<Disease>>
// The query from question ^
}
转换器(在db类中用于将String转换为列表)
class Converter {
@TypeConverter
fun fromString(stringListString: String) = stringListString.split(";").map { it.toInt() }
@TypeConverter
fun toString(stringList: List<Int>) = stringList.joinToString(";")
}
是否可以按房间查询列表中至少具有一个症状ID的所有疾病?我正在使用MVVM模式,是否可以在DAO中做到这一点,还是应该在Repository或ViewModel类中创建一个函数?
第一个例子:
输入= listOf(0)
结果= listOf(diseaseA, diseaseC)
第二个例子:
输入= listOf(1, 2)
结果= listOf(diseaseA, diseaseB, diseaseC)
您必须在中进行操作,ViewModel
因为SQL / Room无法理解List
类型,因此无法为您执行此类检查。
fun getDiseasesWithSymptoms(symptoms: List<Int>): LiveData<List<Disease>> {
return Transformations.map(diseaseDao.getAllDiseases()) { diseases ->
diseases.filter { disease ->
disease.listOfSymptoms.any { symptoms.contains(it)}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句