【问题标题】:Searching multiple (varying) user inputs on a SQLite table在 SQLite 表上搜索多个(变化的)用户输入
【发布时间】:2017-08-12 04:46:39
【问题描述】:

所以我最近一直在摆弄 Recycler View 和 SQLite,我担心我被难住了。

挑战是: 有一个 EditText 视图,用户可以通过简单地命名来搜索汽车,无论是按型号、制造商还是两者兼而有之:

“Hon”回归:本田思域

“c”返回本田思域、福特福克斯、雪佛兰onix

当我尝试使用多个关键字时会出现问题:

“hon c”返回:HONda civic、HONda civic、ford foCus、Chevrolet onix(我会解释双honda civic bug)

但首先,这是代码:

for(String s : query.split(" ")) {
        cursor = db.rawQuery("Select * from brasil WHERE (maker LIKE '%" + s + "%' or model LIKE '%" + s + "%')" , null);

        if(cursor != null  && cursor.getCount() > 0) {
            cursor.moveToFirst();
            do {
                Car car = new Car(
                        cursor.getString(1),
                        cursor.getString(2),
                        cursor.getString(3),
                        cursor.getInt(4),
                        cursor.getInt(5)
                );
                cars.add(car);
            } while (cursor.moveToNext());
        }
    }

发生双重本田思域错误的原因是: "Hon c" 2 个字符串,所以 2 个循环 它在 honda 中找到 hon,在 civic 中找到 c,这两种情况都被添加到返回数据的数组中。

现在我想要发生的事情: “亲爱的c” 在 honda civic 中找到“hon”和“c”,因此将其添加。

在其他人身上找到“c”但没有“hon”,所以他们不应该被添加。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    按照 Muthukrishnan 的说法,我认为您需要在 WHERE 子句中添加 select distinctAND

    String query = "Select distinct * from brasil WHERE (";
    
    String[] values = query.split(" ");
    
    for (int i = 0; i < values.length; i++) {
        if(i != 0) {
            query += " AND ";
        }
    
        query += "(maker LIKE '%" + values[i] + "%' or model LIKE '%" + values[i] + "%')";
    }
    query += ")";
    
    Cursor cursor = db.rawQuery(query , null);
    
    if(cursor != null  && cursor.getCount() > 0) {
        cursor.moveToFirst();
        do {
            Car car = new Car(
                    cursor.getString(1),
                    cursor.getString(2),
                    cursor.getString(3),
                    cursor.getInt(4),
                    cursor.getInt(5)
            );
            cars.add(car);
        } while (cursor.moveToNext());
    }
    

    如果您搜索“hon c”,这应该只给您“Honda Civic”。

    【讨论】:

    • 我明白了,你上面的那个人还提供了一个解决方案,通过在每个关键字的循环中构建一个完整的字符串,它有效,但它仍然显示不需要的结果:例如:“honda c”返回本田civic 和 Chevrolet onix,因为后者上面有“c”,但在这种情况下,我希望它把结果细化为只有 honda civic,因为 chevrolet onix 里面没有“honda”。另一个例子:“c”应该返回 chevrolet onix 和 honda civic,但“c h”或“c ho”或“c hon”应该只返回 honda civic
    • 抱歉,直到一分钟前我才看到您插入的代码。我刚刚更新以反映您问题中的编辑,所以我认为现在应该可以解决它。
    • 效果很好!太感谢了!我不知道“明显”的可能性..谢谢!
    • 太棒了!如果这解决了所有问题,您可以选择这个作为接受的答案吗?
    【解决方案2】:

    你可以这样查询得到重复,

    String query = "Select * from brasil WHERE (";
    
    String[] values = query.split(" ");
    
    for (int i = 0; i < values.length; i++) {
        if(i != 0) {
            query += " OR ";
        }
    
        query += "maker LIKE '%" + values[i] + "%' or model LIKE '%" + values[i] + "%' ";
    }
    query += ")";
    
    Cursor cursor = db.rawQuery(query , null);
    
    if(cursor != null  && cursor.getCount() > 0) {
        cursor.moveToFirst();
        do {
            Car car = new Car(
                    cursor.getString(1),
                    cursor.getString(2),
                    cursor.getString(3),
                    cursor.getInt(4),
                    cursor.getInt(5)
            );
            cars.add(car);
        } while (cursor.moveToNext());
    }
    

    【讨论】:

    • 谢谢,这确实解决了重复问题,尽管我仍然无法找到一种方法来仅过滤找到“hon”和“c”的结果..
    • 你的结果应该只有这个吧..? 本田思域、福特福克斯、雪佛兰 onix
    • 或者你的结果应该只有HONda civic、Chevrolet onix这2个。?
    • 让我问得好一点:如果用户输入“honda”,它应该显示 honda civic,如果用户按“honda c”,它仍然应该只显示 honda civic 而没有 chevrolet,因为 chevrolet 没有里面有“本田”
    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多