代码之家  ›  专栏  ›  技术社区  ›  user2872856

rawQuery()精确匹配

  •  -2
  • user2872856  · 技术社区  · 6 年前

    我使用以下方法查询SQLite数据库 LIKE 陈述

    public List<Bean> getWords(String englishWord) {
            if(englishWord.equals(""))
                return new ArrayList<Bean>();
            String sql = "SELECT * FROM " + TABLE_NAME +
                    " WHERE " + ENGLISH + " LIKE ? ORDER BY LENGTH(" + ENGLISH + ") LIMIT 100";
    
            SQLiteDatabase db = initializer.getReadableDatabase();
    
            Cursor cursor = null;
            try {
                cursor = db.rawQuery(sql, new String[]{"%" + englishWord.trim() + "%"});
    
                List<Bean> wordList = new ArrayList<Bean>();
                while(cursor.moveToNext()) {
                    String english = cursor.getString(1);
                    String mal = cursor.getString(2);
                    wordList.add(new Bean(english, bangla));
                }
    
                return wordList;
            } catch (SQLiteException exception) {
                exception.printStackTrace();
                return null;
            } finally {
                if (cursor != null)
                    cursor.close();
            }
        }
    

    我想更改上面的代码,因为它将查询精确匹配。我试图修改代码如下,但我不知道如何获得 mal 一串

    public void getoneWords(String englishWord) {
            String sql = "SELECT * FROM " + TABLE_NAME +
                    " WHERE " + ENGLISH + " =?";
    
            SQLiteDatabase db = initializer.getReadableDatabase();
    
            Cursor cursor = null;
            try {
                cursor = db.rawQuery(sql, new String[]{englishWord});
    
                while(cursor.moveToNext()) {
                    String english = cursor.getString(1);
                    String mal = cursor.getString(2);
                }
            } finally {
                if (cursor != null)
                    cursor.close();
            }
        }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Tung Tran    6 年前

    方法 getoneWords 为什么。你应该回去 mal english 在此函数中。

    return new Bean(english, mal);
    

    如果您需要第一个单词,只需光标即可。moveToFirst和delete while循环:

    String english = cursor.getString(1);
    String mal = cursor.getString(2);
    return new Bean(english, mal);
    
        2
  •  0
  •   user2872856    6 年前

    我终于自己解决了这个问题。

    public String getoneWords(String englishWord) {
            String sql = "SELECT * FROM " + TABLE_NAME +
                    " WHERE " + ENGLISH + " =?";
    
            SQLiteDatabase db = initializer.getReadableDatabase();
            Cursor cursor = null;
            String meaning = "";
            try {
                cursor = db.rawQuery(sql, new String[] {englishWord});
                if(cursor.getCount() > 0) {
                    cursor.moveToFirst();
                    meaning = cursor.getString(2);
                }
                return meaning;
            }finally {
                cursor.close();
            }
        }
    
        3
  •  0
  •   cwiesner    6 年前

    在您的 getoneWords() 您没有返回查询的值。 由于您有两个返回值,您可能需要将它们成对包装,或者创建一个“holder”对象(例如。 class Words(String english, String mal) )用于返回值。

    如果查询返回多个匹配项,则需要返回这些对象的列表。否则,上述代码将只返回最后一个匹配项。

    因此,您需要更改函数以返回查询的

    public Pair<String,String> getoneWords(String englishWord) {
        Pair<String,String> result = null;
        ...
        if(cursor.moveToNext()) {
             String english = cursor.getString(1);
             String mal = cursor.getString(2);
             result = new Pair<String,String>(english, mal);
        }
        ... 
        return result;
    
    }