我有一个实体,其中的一个字段是MutableList。我想返回该列表中包含给定ID的所有用户ID。查询总是返回一个空列表。如果我打开数据库,则可以看到字段存储正确并且有要返回的用户ID。我究竟做错了什么?
数据类:
@Entity
data class User(
@PrimaryKey
@SerializedName("id")
@ColumnInfo(name = "userId")
var userId: String,
@SerializedName("username")
var userName: String = "",
var city: String = "",
var postsIds: MutableList<String>
)
Dao:
@Dao
interface UserDao {
@Query("SELECT * FROM user WHERE postsIds LIKE :id")
fun getForPost(id: String): List<User>
// some other queries
}
存储库:
fun getUsersForPost(id: String): LiveData<List<User>> {
val data = MutableLiveData<List<User>>()
GlobalScope.launch {
val query = async(Dispatchers.IO) { userDao.getForPost(id) }
val result = query.await()
if (result.isNullOrEmpty()) {
// todo fetch from the API
} else {
data.postValue(result)
}
}
return data
}
用法:
ViewModel:
fun getPost(id: String): Post {
val post = repository.getPost(id)
_postEditors.value = repository.getUsersForPost(id).value
return post
}
Fragment:
viewModel.postEditors.observe(this, Observer {
Log.d(TAG, $it)
})
答案 0 :(得分:0)
仅通过查看您的代码,我认为您正在做userDao.getForPost(id)
,但您可能应该做userDao.getForPost("%"+id+"%")
答案 1 :(得分:0)
据我所知,您似乎正在使用 LIKE
(而不是 =
) > (完全匹配)运算符:
@Dao
interface UserDao {
@Query("SELECT * FROM user WHERE postsIds = :id")
fun getForPost(id: String): List<User>
// some other queries
}
现在,我确定您有自己的用例。使用 Room 1.1.1 + 时,您需要按如下所示向 LIKE
运算符添加通配符%,否则可能不起作用:
@Dao
interface UserDao {
@Query("SELECT * FROM user WHERE postsIds LIKE `%` || :id || `%`")
fun getForPost(id: String): List<User>
// some other queries
}
N.B:
|| is concatenation operator
和% wildcard
SQLite wildcards这将导致搜索与提供的
id
相匹配的任何内容 又名:Full Text Search,如果您只想匹配以id
开头的任何内容,则可以执行以下操作:@Dao interface UserDao { @Query("SELECT * FROM user WHERE postsIds LIKE :id || `%`") fun getForPost(id: String): List<User> // some other queries }
另一个提示,如果您确实要对Room使用全文搜索,那么我建议您更新到 v2.1 ,其中添加了FTS4支持,下面是有关Medium
的详细介绍