【问题标题】:Room Persistance Library - Query with WildCards房间持久性库 - 使用通配符查询
【发布时间】:2019-12-17 15:38:35
【问题描述】:

在我的 Room Dao 类中,我有如下查询方法:

@Query("SELECT * FROM word_table WHERE firstName LIKE :word")
fun findByName(word:String): DataSource.Factory<Int, Word>

我还想检索带有通配符的名称,其中单词的开头和结尾可以是任何内容。 因此,像"book" 这样的查询也应该返回单词“CarBook", "MathBook", "BooksForLearning", "TheBooksToTry"。因此,查询应该捕获术语"book" 可以在任何位置的单词。这可能与SQL 关键字LIKE 或做我需要添加其他关键字吗?

在一些 SQL 查询中,我看到 % 被添加在开头和结尾(在我的情况下,会是 "%" + :word + "%" 吗??),但我不知道在 Room 中该怎么做。

【问题讨论】:

  • 将 %word% 传递给它应该工作的函数

标签: android sql wildcard android-room


【解决方案1】:

如何在 ROOM 持久性库 (Android) 中使用 SQL Wide 卡

所以这就是我能够做到这一点的方式。

第一步

在你的 DAO 类中

@Query("SELECT * FROM word_table WHERE firstName LIKE :word") fun findByName(word:String):List&lt;YouDataModel&gt;

注意:我将结果作为列表返回,您可以按照您想要的任何方式返回它

第二步

在您的视图模型类中

var searchResult = MutableLiveData&lt;List&lt;YouDataModel&gt;&gt;()

fun findByName(word: String?): LiveData<List<YouDataModel>> { 
     viewModelScope.launch(Dispatchers.IO) {
         val result = adsRepo.findByName(word)
         searchResult .postValue(result)
     }
  return searchResult 
}

到此为止

在您的活动或片段中

val viewModel = ViewModelProvider(this).get(YourModelClassName::class.java)

viewModel.searchResult("%${search.text}%").observe(viewLifecycleOwner, Observer{
                Log.d("TAG", "${it.size}")
})

注意:SQL 通配符作为参数传入此视图模型函数searchResult("%${search.text}%")

【讨论】:

    【解决方案2】:

    这是您在声明表时必须启用的全文搜索 (FTS) 功能。这是一个 SQLite 特性。

    这是一个 repo,你可以在其中找到一些信息:https://github.com/android/architecture-components-samples/commit/c0d72f210241ff310bba13db9b8748081d6feab9

    这里有一篇文章可以指导您完成整个过程: https://medium.com/@sienatime/enabling-sqlite-fts-in-room-2-1-75e17d0f0ff8

    祝你好运

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 2018-05-27
      • 2018-01-22
      • 1970-01-01
      • 2018-01-19
      • 2020-03-19
      • 2017-10-29
      • 1970-01-01
      相关资源
      最近更新 更多