房间查询:列表中的查找始终返回null

时间:2019-06-26 12:51:29

标签: android kotlin android-room android-architecture-components

我有一个实体,其中的一个字段是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)
})

2 个答案:

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

的详细介绍