我有一个庞大的邮政编码列表,我需要实现一个搜索功能。
我喜欢做的是:
使用这些字符串中的任何一个,结果"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,如下所示
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是:
@Query("SELECT * FROM PostalCode WHERE lower(full_postal_code) LIKE :filterString")
fun SearchQuery(filterString: String) : List<PostalCode?>? 显然这不像我想要的那样有效,
我还试图将搜索字符串拆分成单词,并从类似的数组中进行搜索。
var filterWords = string.toLowerCase().split(" ", "-").toMutableList()
viewModel.getFilteredPostalCodes(filterWords)并从房间中查询道
@Query("SELECT * FROM PostalCode WHERE lower(full_postal_code) IN (:filterStrings)")
fun SearchQueryFromArray(vararg filterStrings: String) : List<PostalCode?>?但这失败了,因为数组的每个值都不允许部分匹配
做这件事最好的方法是什么?
发布于 2020-08-20 22:35:49
也许这是一个不寻常的想法,但考虑使用RawQuery。只有当您在定义静态查询文本时遇到一些问题时,才应该使用它。但看起来可能是这样的。主要想法-根据您的filterWords列表获得动态查询文本(因为您希望列表中的所有单词匹配到结果):
select * from PostalCode where
full_postal_code LIKE ? AND full_postal_code LIKE ? ...(?在RawQuery中使用,在原始Sqlite中使用--作为参数占位符--每个搜索单词的LIKE语句)。
所以在Dao方法中:
@RawQuery
fun getUser(query: SupportSQLiteQuery): List<PostalCode?>?然后,应该添加辅助方法(也可以放到dao中),该方法应该使用所需的查询字符串生成这个SupportSQLiteQuery对象(这不是最优的,您可以清理它,用StringBuilder替换任何东西):
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方法。
https://stackoverflow.com/questions/63512208
复制相似问题