如何解决从与ROOM上数组值部分匹配的列中搜索
我有大量的邮政编码,我需要为其实现搜索功能。
我想做的是:
使用这些字符串中的任何一个,结果应出现“ 2695-650,SãoJoãoda Talha” :
“ 2695”
“ 2695-650”
“ 2695 650”
“圣若昂”
“ saoA da TaLH”
“ sao talha”
“ talh joa”
“ joao talha”
“塔拉650 joao”
我做了一个编辑文本并像这样实现了它的列表器
var controller = "";
var signal = "";
function updateTable() {
controller = new AbortController();
signal = controller.signal;
fetch('/json',{signal})
.then((response) => {return response.json()})
.then((response) => {
response.records.forEach(el => {
return '<li>' + el.Name + '</li>';
})
})
}
$('button').click(function(){
controller.abort();
$('body').empty();
updateTable()
})
当前正在使用的会议室查询是:
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,before: Int,count: Int) {
var string = s.toString()
if(string.isNullOrBlank())
viewModel.getPostalCodes()
else{
var filterWord = "%" + string.toLowerCase() + "%"
viewModel.getFilteredPostalCodes(filterWord)
}
}
})
很明显,这显然不符合我的要求,
我还尝试将搜索字符串拆分为单词,然后从这样的数组中搜索。
@Query("SELECT * FROM PostalCode WHERE lower(full_postal_code) LIKE :filterString")
fun SearchQuery(filterString: String) : List<PostalCode?>?
然后从房间dao查询
var filterWords = string.toLowerCase().split(" ","-").toMutableList()
viewModel.getFilteredPostalCodes(filterWords)
但是这失败了,因为数组的每个值都不允许部分匹配
做到这一点的最佳方法是什么?
解决方法
这可能是一个不寻常的想法,但请考虑使用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
方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。