0

私のアプリケーションは動作しているので、緊急の問題ではない問題が発生していますが、なぜこのように動作するのかを本当に理解したいと思います。
私のプログラムには、2つの文字列入力(categoryIntervalとpaymentInterval)を持つメソッド(findFilterInTable)があります。

このメソッドはデータベースにリクエストを送信し、categoryInterval=somethingおよびpaymentInterval=something(クリックされたボタン、ユーザーの選択などに応じて)のいくつかの列で要素を検索します。

私のアプリケーションには、次のようにpaymentIntervalの値を設定するラジオボタンがあります。

OnClickListener radiobutton_no_listener = new OnClickListener() {
    public void onClick(View v) {
        paymentInterval = null ; 
    }
};

OnClickListener radiobutton_yes_listener = new OnClickListener() {
    public void onClick(View v) {
        paymentInterval = " LIKE " + " '%visa%' " ; 
        }
};

したがって、ユーザーが[いいえ]ボタンをクリックすると、paymentIntervalがnullになります。

これが私のデータベースにクエリを実行するメソッドです。PaymentIntervalがnullのときにCOL_PAYMENTでリクエストを行っているときにクラッシュしていたので、クエリを変更したいので、paymentIntervalがnullの場合、データベース(COL_PAYMENT)の関連する列をクエリしません。それ以外の場合(paymentIntervalがnullでない場合)、COL_PAYMENTを照会し、結果を収集します。
私はこの方法を試しましたが、うまくいきませんでした。絶望してステートメントを交換したところ、うまくいきました。

 public Cursor findFilterInTable(String categoryInterval,
        String paymentInterval) {
    String where;
    if (paymentInterval != null) {
        where = "(" + COL_CAT1 + " IN " + categoryInterval + " OR "
                + COL_CAT2 + " IN " + categoryInterval + " OR " + COL_CAT3
                + " IN " + categoryInterval + ") AND (" + COL_PAYMENT
                + paymentInterval + ") ";
    }

    else {
        where = COL_CAT1 + " IN " + categoryInterval + " OR " + COL_CAT2
                + " IN " + categoryInterval + " OR " + COL_CAT3 + " IN "
                + categoryInterval;
    }

    Cursor c = myDatabase.query(DATABASE_TABLE, new String[] { KEY_ROWID,
            COL_NAME, COL_STREET, COL_WEBSITE, COL_PAYMENT, COL_TELEPHONE,
            COL_PRICE, COL_REMARKS, COL_DATEFRIENDLY }, where, null, null,
            null, null);
    return c;
}

このコードは機能し、書かれているものとは逆に動作します。アプリケーションを使用する場合:
-paymentIntervalがnullの場合(ユーザーが[NO]をクリックした場合)、COL_PAYMENTを照会しません
-paymentIntervalがnullでない場合(私の場合は%visa%のように)、データベースを照会し、正しい結果を表示します。

この奇妙な結果の原因を知っていますか?

[編集]私のボタンに接続されたリスナー:

radiobutton_yes = (RadioButton) dialogView
                .findViewById(R.id.radiobutton_yes);
        radiobutton_yes.setOnClickListener(radiobutton_yes_listener);

        radiobutton_no = (RadioButton) dialogView
                .findViewById(R.id.radiobutton_no);
        radiobutton_no.setOnClickListener(radiobutton_no_listener);
4

1 に答える 1

2

このコードは、書かれていることを正確に実行します。

if (paymentInterval != null)

!=is not equal演算子です。したがって、paymentIntervalがnullに等しくない場合、クエリにCOL_PAYMENTが追加されます。そうでなければ、それはそれを省きます。

于 2013-03-27T07:39:18.983 に答える