0

TabLayout を作成し、選択したタブでデータベースのエントリを表示したいと考えています。クエリを含むコード スニペットを次に示します。

public Cursor filteredItems(int tabPosition) throws SQLException {
        Log.d(TAG, "filteredItems called, Parameter: "+tabPosition); 

        String filter = ""; 
        if(tabPosition == 0){
            filter = "[a-cA-C]%";
        }else if(tabPosition == 1){
            filter = "[d-fD-F]%";
        }else{
            Log.d(TAG, "default tab"); 
            filter = "[a-zA-Z]%";
        }

        Cursor cursor = null;
        try{
            open();
            String query ="SELECT _id, surname, prename, street, zipcode, telephone, email FROM "+Database.getMyDbTable()+" " +
                    "WHERE surname LIKE '"+filter+"';";
            Log.d(TAG,"Query "+query);
            cursor = database.rawQuery(query, null);
        }catch(Exception ex){
            Log.e(TAG, "Could not get list");
            CharSequence text = dataNotFound;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }

        return cursor;
    }

残念ながら、フィルターは機能しません - クエリの結果は常に空です (テーブルは空ではありません - チェックしました)。

4

4 に答える 4

1

この目的には、ワイルドカードを使用する必要があります。http://sqlite.awardspace.info/syntax/sqlitepg03.htmで読む

試す

SELECT _id, surname, prename, street, zipcode, telephone, email FROM table WHERE surname LIKE '<your letter(s)>%'
于 2013-02-05T10:38:07.457 に答える
1

まず、LIKE 演算子は正規表現を使用しません。これを行う REGEXP 演算子は、残念ながら Android ではサポートされていません。

解決策: 論理 OR で LIKE を使用します。

String query ="SELECT _id, surname, prename, street, zipcode, telephone, email FROM "+Database.getMyDbTable()+" WHERE surname LIKE 'a%' OR surname LIKE 'b%' OR surname LIKE 'c%';";
于 2013-02-05T10:45:57.053 に答える
0

LIKE文字セットと一致できません。

最初の文字だけを気にするので、BETWEEN代わりに次を使用できます。

SELECT ... FROM MyTable WHERE surname BETWEEN 'A' AND 'Czzzz'

大文字と小文字の両方を処理するには、2 つの条件を使用するか、照合順序を変更します。

SELECT ... FROM MyTable WHERE surname BETWEEN 'A' AND 'Czzzz'
                           OR surname BETWEEN 'a' AND 'czzzz'

SELECT ... FROM MyTable WHERE surname COLLATION UNICODE BETWEEN 'A' AND 'Czzzz'

後者は、列またはインデックスが同じ照合順序で宣言されている場合にのみ、インデックスを使用できます。

于 2013-02-05T13:19:49.767 に答える
0

次のようなものを試してください:

"SELECT _id, surname, prename, street, zipcode, telephone, email FROM " + Database.getMyDbTable() + " WHERE substr(" + Database.getMyDbTable()  +",1) LIKE " + <yourletter>

を使用substrすると、最初の文字のみを比較しています。

于 2013-02-05T10:44:35.977 に答える