0

データベースに存在する特定のキーワードを検索して表示したかったのです。

検索クラスのコードは次のとおりです。

String s = kw.getText().toString();

sqlhandler show = new sqlhandler(this);
show.open();
String rname = show.getName(s);
show.close();
tv.setText(rname);

そして、ここに私のデータベースクラスがあります:

public String getName(String kw) {

    String[] columns = new String[] {NAME, APRICE, DPRICE, VENDOR, KEYWORD };

    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, "DPRICE like " + "'%"+ kw+"%'", null, null, null, null);

    String sresult = "";

    int iname = c.getColumnIndex(NAME);
    int iap = c.getColumnIndex(APRICE);
    int idp = c.getColumnIndex(DPRICE);
    int ivendor = c.getColumnIndex(VENDOR);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        sresult = sresult + c.getString(iname)+ " "+c.getString(iap)
            + "  " + c.getString(idp) + "  " + c.getString(ivendor)
        + "\n";
    }

    return sresult;
}

ここで私の問題は何ですか?走るたびに力が入り続けます。

4

1 に答える 1

0

LogCatを投稿していないので、推測することしかできませんが、WHERE句は疑わしいようです。

"DPRICE like ..."

DPRICE実際の列名ではなく、変数であると想定しています。

DPRICE + " like ..."

また、いくつかの推奨事項があります。

  • SQLインジェクション攻撃selectionArgsを防ぐためにパラメータを使用します。
  • ListViewとSimpleCursorAdapterを使用してデータを表示することを検討してください。
  • 使用している列のみを選択してください。
  • forループの代わりにwhileループを使用して、カーソルを反復処理します(forループは必要な作業の3倍を実行しています)。

すべて一緒に:

public String getName(String kw) {
    String[] columns = new String[] {NAME, APRICE, DPRICE, VENDOR};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, DPRICE + " like ?", new String[] {"'%" + kw + "%'"}, null, null, null, null);

    int iname = c.getColumnIndex(NAME);
    int iap = c.getColumnIndex(APRICE);
    int idp = c.getColumnIndex(DPRICE);
    int ivendor = c.getColumnIndex(VENDOR);

    // moveToNext() returns true when there is more data to read 
    //     or false when the cursor isAfterLast()
    StringBuilder builder = new StringBuilder();
    while (c.moveToNext()) {
        builder.append(c.getString(iname).append(" ")
               .append(c.getString(iap).append("  ")
               .append(c.getString(idp).append("  ")
               .append(c.getString(ivendor).append("\n");
    }

    return builder.toString();
}

これは、カスタムレイアウトでListViewを使用して、データベースからの情報を表示する方法に関するチュートリアルです。

于 2012-08-31T16:04:41.680 に答える