android studio中的搜索查询无法正常工作

Posted

技术标签:

【中文标题】android studio中的搜索查询无法正常工作【英文标题】:Search query in android studio not workng properly 【发布时间】:2018-09-12 12:02:34 【问题描述】:

好的,所以我制作了用于搜索药物并在列表视图中显示项目的模块,我在这里使用 JDBC。主要问题是当我在搜索视图中放置下划线_ 时,它会导致列表视图项重复自身的错误。

根据我的观察;此错误仅在同时插入下划线时发生,但如果以较慢的间隔按下,它无论如何都不会重复项目。


这是 SearchView 上没有任何内容时的样子:


这是下划线放置在较慢的间隔

即使列表视图中不存在下划线它仍然会显示它,但是当我添加更多下划线时,它们开始从底部开始一个接一个地消失。


这是主要问题;当同时放置下划线时

这是我在 AsyncTask 中搜索的代码

private class searchUnfiltered extends AsyncTask<String, String, String> 

String z = "";
String fromSearchView = sv.getQuery().toString().trim();
boolean isSuccess = false;

String about;

@Override
protected void onPreExecute() 
    myArrayList2.clear();
    myArrayList.clear();
    super.onPreExecute();


@Override
protected String doInBackground(String... params) 

    try 
        Connection con = connectionClass.CONN();
        if (con == null) 
            z = "Please check your internet connection";
         else 

            String querySearch = "select name from medicines where name like '%"+ fromSearchView +"%' order by name ASC";

            Statement stmt1 = con.createStatement();

            ResultSet rs1 = stmt1.executeQuery(querySearch);
            if(rs1 != null) 
                while (rs1.next()) 

                    myArrayList2.add(rs1.getString("name"));
                
            
        
     catch (Exception ex) 
        isSuccess = false;
        z = "Exceptions" + ex;
    
    return z;


@Override
protected void onPostExecute(String s) 
    if(!isSuccess && !z.equals("")) 
        Toast.makeText(getBaseContext(), z, Toast.LENGTH_LONG).show();
    

    ListAdapter listAdapter = new ArrayAdapter<>(MedicineSearch.this, android.R.layout.simple_list_item_1, myArrayList2);
    lv.setAdapter(listAdapter);


每当搜索视图中的值发生更改时,searchUnfiltered 就会被触发,请告诉我我所做的是否有效,或者您有什么更好的建议,这将非常有帮助。

【问题讨论】:

我认为问题出在搜索查询中。试试下面的查询。 String querySearch = "select DISTINCT name from drug where name like '%"+ fromSearchView +"%' GROUP BY name ORDER BY name ASC"; 是的,但即使我的列表项中不存在单引号,它仍会返回任何内容 【参考方案1】:

这是一个竞争条件原因,您正在清除 PreExecute 上的数据,然后 doInBackground 正在工作,快速键入 5 _ 将清除 5 次,然后才能获得任何结果。

作为解决方案:

myArrayList2.clear();// if this didn't work try myArrayList2 = new ArrayList<>();

从 onPreExecute 到 doInBackground。

【讨论】:

你试过 myArrayList2.clear() 还是 myArrayList2 = new ArrayList(); 通过按下按钮 3 次,您在任务开始之前清除了 3 次数组,同时在 doInBackground 内部清除时,您将在每次执行 doInBackground 时清除,并且它们一一执行。我只是根据经验假设。 您的意思是创建arraylist 的实例?是的。那么这意味着所有操作都应该在doInBackground() 内呢? onPreExecute 可以是灰显字段或启动进度条(UI 工作),doInBackground 大多数计算或网络调用(这里没有 UI 工作),onPostExecute 是更多 UI 工作。但这可能会因所考虑的目标而异。

以上是关于android studio中的搜索查询无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章