首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从房间数组值部分匹配的列中搜索

从房间数组值部分匹配的列中搜索
EN

Stack Overflow用户
提问于 2020-08-20 19:46:49
回答 1查看 213关注 0票数 0

我有一个庞大的邮政编码列表,我需要实现一个搜索功能。

我喜欢做的是:

使用这些字符串中的任何一个,结果"2695-650,S o Jo o da Talha"应该出现:

"2695“

"2695-650“

"2695 650“

“圣若昂”

"sAo joA da TaLH“

“圣塔尔哈”

"talh joa“

"joao talha“

"talha 650 joao“

我制作了一个编辑文本并实现了它的listner,如下所示

代码语言:javascript
复制
    txtSearch = root.findViewById(R.id.txtPostalCodeSearch)
    txtSearch?.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(s: Editable) { }
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { }
        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
            var string = s.toString()

            if(string.isNullOrBlank())
                viewModel.getPostalCodes()
            else{
                var filterWord = "%" + string.toLowerCase() + "%"
                viewModel.getFilteredPostalCodes(filterWord)
            }
        }
    })  

目前使用的房间数据查询im是:

代码语言:javascript
复制
@Query("SELECT * FROM PostalCode WHERE lower(full_postal_code) LIKE :filterString")
fun SearchQuery(filterString: String) : List<PostalCode?>?  

显然这不像我想要的那样有效,

我还试图将搜索字符串拆分成单词,并从类似的数组中进行搜索。

代码语言:javascript
复制
var filterWords = string.toLowerCase().split(" ", "-").toMutableList()
viewModel.getFilteredPostalCodes(filterWords)

并从房间中查询道

代码语言:javascript
复制
@Query("SELECT * FROM PostalCode WHERE lower(full_postal_code) IN (:filterStrings)")
fun SearchQueryFromArray(vararg filterStrings: String) : List<PostalCode?>?

但这失败了,因为数组的每个值都不允许部分匹配

做这件事最好的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-08-20 22:35:49

也许这是一个不寻常的想法,但考虑使用RawQuery。只有当您在定义静态查询文本时遇到一些问题时,才应该使用它。但看起来可能是这样的。主要想法-根据您的filterWords列表获得动态查询文本(因为您希望列表中的所有单词匹配到结果):

代码语言:javascript
复制
select * from PostalCode where 
full_postal_code LIKE ? AND full_postal_code LIKE ?  ...

(?在RawQuery中使用,在原始Sqlite中使用--作为参数占位符--每个搜索单词的LIKE语句)。

所以在Dao方法中:

代码语言:javascript
复制
@RawQuery
fun getUser(query: SupportSQLiteQuery): List<PostalCode?>?

然后,应该添加辅助方法(也可以放到dao中),该方法应该使用所需的查询字符串生成这个SupportSQLiteQuery对象(这不是最优的,您可以清理它,用StringBuilder替换任何东西):

代码语言:javascript
复制
fun findUser(filterWords: List<String>): List<PostalCode?>? {
    var queryString = "select * from PostalCode where 1 = 1 " // <- just for easier concat, change it as you like
    repeat(list.size) {searchString += " and user_name LIKE ?"}
    val query = SimpleSQLiteQuery(queryString, filterWords.toTypedArray()) // <- second parameter should be array
    return getUser(query)
}

然后,您可以从viewModel/存储库调用这个findUser方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63512208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档