0

私のメイン アクティビティは、文字列を別のアクティビティに渡します (単にサブ アクティビティと呼びましょう)。このサブ アクティビティでは、その文字列をカーソル生クエリで使用して、文字列に一致するデータベースからデータを選択する必要があります。

public class RestaurantsInfo extends ListActivity {

static final String restaurantListTable = "RestaurantList";
static final String colRestaurantID = "RestaurantID";
static final String colRestaurantName = "RestaurantName";
static final String colRestaurantStore = "StoreNo";
static final String colRestaurantAddress = "StoreAddress";
public String strRestaurantName;
RestaurantDB db = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listview);
    db=new RestaurantDB(RestaurantsInfo.this);

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();

    String strRestaurantName = extras.getString("RestaurantName");
    setTitle(strRestaurantName);
    getData();
  }

private Cursor doQuery(String strRestaurantName) {
    return(db.getReadableDatabase().rawQuery("SELECT "+colRestaurantID+" AS _id, "+colRestaurantName+", "+colRestaurantStore+", "+colRestaurantAddress+
            " FROM "+restaurantListTable+" WHERE "+colRestaurantName+" = strRestaurantName ORDER BY "+colRestaurantStore+"", null));
    }


public void getData() {
    SimpleCursorAdapter adapter;

    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
        adapter=new SimpleCursorAdapter(this, R.layout.activity_address,
                doQuery(strRestaurantName), new String[] {
            RestaurantDB.colRestaurantName,
            RestaurantDB.colRestaurantStore,
            RestaurantDB.colRestaurantAddress },
            new int[] { R.id.textView1, R.id.textView2, R.id.textView3 },
            0);
        }
    else {
        adapter=new SimpleCursorAdapter(this, R.layout.activity_address,
                doQuery(strRestaurantName), new String[] {
            RestaurantDB.colRestaurantName,
            RestaurantDB.colRestaurantStore,
            RestaurantDB.colRestaurantAddress },
            new int[] { R.id.textView1, R.id.textView2, R.id.textView3 });
        }

    setListAdapter(adapter);

    }
}

コードからわかるように、文字列を渡してクエリstrRestaurantNameで使用しようとしましたが、うまくいきWHEREません! ログ ファイルには「そのような列はありません」と表示さstrRestaurantNameれていますが、列という意味ではありません。doQuery()の代わりに試しdoQuery(strRestaurantName)ましたが、同じエラーが発生しました。私は何をすべきか?

4

3 に答える 3

1

SQL 文字列は引用符で囲む必要があります。

"WHERE "+colRestaurantName+" = '" + strRestaurantName + "'"

(私はある時点でこれを逆にしました、ごめんなさい)。


実際には、SQL インジェクション攻撃を防ぐためにパラメーター化を使用する必要があります。次のように:

return(db.getReadableDatabase().rawQuery(
    "SELECT "+colRestaurantID+" AS _id, "+colRestaurantName+", "+colRestaurantStore+", "+colRestaurantAddress+
    " FROM "+restaurantListTable+
    " WHERE "+colRestaurantStore+" = ?" + 
    " ORDER BY "+colRestaurantStore, 
    new String[] {strRestaurantName}));

インテントとバンドルが onCreate() 内に配置されている場合、私のプライベート doQuery() は strRestaurantName の値を取得できないようです。

... という名前の 2 つの変数を誤って作成してしまいましstrRestaurantNameた。フィールド変数とローカル変数が にありonCreate()ます。この行を変更します。

String strRestaurantName = extras.getString("RestaurantName");

これに:

strRestaurantName = extras.getString("RestaurantName");

これで 1 つだけにstrRestaurantNameなり、 に適切な値が設定されdoQuery()ます。

于 2012-12-16T06:59:43.467 に答える
0

これはメソッドで有効な SQL クエリではありません。これを試すことができます:

private Cursor doQuery(String strRestaurantName) {
    return(db.getReadableDatabase().rawQuery("SELECT "+colRestaurantID+" AS _id, "+colRestaurantName+", "+colRestaurantStore+", "+colRestaurantAddress+
            " FROM "+restaurantListTable+" WHERE "+colRestaurantName+" = "+ strRestaurantName +" ORDER BY "+colRestaurantStore+"", null));
    }
于 2012-12-16T07:09:25.430 に答える
0

変数を追加するのではなく、文字列を追加するだけです 変数名 strRestaurantName を引用符で囲まないでください

+" WHERE "+colRestaurantName+" = " +strRestaurantName+ "ORDER BY "+colRestaurantStore+""
于 2012-12-16T07:01:55.707 に答える