私のアプリケーションは動作しているので、緊急の問題ではない問題が発生していますが、なぜこのように動作するのかを本当に理解したいと思います。
私のプログラムには、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);