Android SQLite:エントリの検証/確認

誰かが私を助けるためにこれに少しの光を照らすことができるかもしれないと願っています。私はユーザーがシリアル番号とリファレンス番号を入力し、ロードボタンを押すEditTextフィールドを持っています。

http://i.stack.imgur.com/95iWI.png

その番号が既にデータベースに追加されているかどうかを確認する方法を作りました。それがない場合は、私は、データベースに追加するかどうかを尋ねるポップアップするはい/いいえダイアログが表示されます。 DB内にあれば、その番号のデータを4つのTextViewにロードします。

http://i.stack.imgur.com/dHbCQ.png

彼らが「はい」を選択すると、新しいインテントが実行され、フォーム画面に切り替わります(ユーザーインプットはまだ別のクラスに渡されていません)。私の小さな問題に戻ってくるには、エミュレータでこれをテストするとすべて正常に動作します。その後、すでに入力した番号を入力すると、まだダイアログが開きます(if文にあります)。

ロードボタンコード

String s = input.getText().toString();
int l = Integer.parseInt(s);
Db load = new Db(this);
load.open();
y = load.dbCheck(l);
if (y != 0) {
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog,int which) {
        switch (which) {
        case DialogInterface.BUTTON_POSITIVE:
            Intent i = new Intent("android.intent.action.FORM");
            startActivity(i);
            break;

        case DialogInterface.BUTTON_NEGATIVE:

            break;
        }
        }
    };
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Would you like to add to Database?")
    .setTitle("Not in Database:")
    .setPositiveButton("Yes", dialogClickListener)
    .setNegativeButton("No", dialogClickListener)
    .show();
} 
else 
{       
    final Dialog dbentery = new Dialog(this);
    dbentery.setTitle("Entry Exists!");
    TextView tv = new TextView(this);
    tv.setText("The serial number you have entered is already in database");
    dbentery.setContentView(tv);
    dbentery.show();
    final Timer t = new Timer();
    t.schedule(new TimerTask() {
        public void run() {
            dbentery.dismiss();
            t.cancel();
        }
    }, 2000);
}       
load.close();

今私が作成した方法では、私はそれが正しいと思ったが、何かが働いていない。私は、それがDBにある場合、それが何をすべきかを検証するために、ifステートメントが0または1を萎縮させるロードボタンコードに整数を戻します。私はそれがカーソルを持つかもしれない、0を返すダイアログを実行しているので、私は考え出した。私はここで類似しているが、私を助けてくれなかったいくつかの他の投稿を見た。あるいは、何が行われているのかを理解していなかった。だから私のDBHelperクラスのチェックメソッドです

/* this is to check to see if entry is in db or not */
public int dbCheck(int l) throws SQLException {
    String[] cols = new String[] { KEY_ROWID, KEY_ONE, KEY_TWO, KEY_THREE, KEY_FOUR };
    Cursor c = ourDB.query(KEY_TABLE, cols, KEY_ONE + "=" + l, null,
            null, null, null);
    if (c == null) {
        return 0;
    }else {
        return 1;
    }       
}

これは簡単な修正かもしれないが、私はそれを見ていないよ...何かを助けてくれたり、私が間違っているかもしれないことを洞察してくれてありがとう

1
あなたがダイアログをポップアップさせている場合、あなたはそれらを入れ替わったと思いませんか?私はあなたがチェックしたはずです、もし(l == 0){//数値がdbに存在しない} else {// number exists}あなたはそれを逆にしたのですか?
追加された 著者 Hiral,
#dbCheck(int)メソッドを終了する前に Cursor#close()
追加された 著者 Jens,
ああ、私はそれを指摘してくれてありがとう、それを変更することを完全に忘れていた
追加された 著者 acrichm,

2 答え

まず、intではなくbooleanを返すように dbCheck()を書き直します。あなたは2つの値、空間の無駄を返す場合、intを持つことに意味がありません。

次に、クエリを書き換えます。そのうちの1つだけをフィルタリングし、その結果を投げ捨てれば、それらの列をすべて選択する必要はありません。これに書き直す:

String s = String.format("SELECT count(*) FROM %s WHERE %s = %d",
                         KEY_TABLE, KEY_ONE, l);
Cursor c = ourDB.rawQuery(s, null);
c.moveToFirst();

return (c.getInt(0) > 0);  //returns a boolean

これにより、コード内に存在する癖の数が削減され、デバッグが容易になります。

編集: rawQuery() query()を修正しました。

0
追加された
申し訳ありませんが、 rawQuery()である必要があります。
追加された 著者 bos,
eclipseはこのカーソルでエラーをスローします。c = ourDB.query(s、null);
追加された 著者 acrichm,
うまくいきました...あなたの助けに感謝します。私は間違いなく両方の方法を使って自分自身をさらに教えるのに役立つだろう。それは多くの助けになっています。
追加された 著者 acrichm,

クエリがエラーをスローする場合はc == null、そうでない場合はc!= null、しかしc.getCount == 0

public int dbCheck(int l) throws SQLException {
String[] cols = new String[] { KEY_ROWID, KEY_ONE, KEY_TWO, KEY_THREE, KEY_FOUR };
Cursor c = ourDB.query(KEY_TABLE, cols, KEY_ONE + "=" + l, null,
        null, null, null);
if (c == null) {
    return 0;
}else {
    return c.getCount() == 0 ? 0:1;

  }       

}

0
追加された
あなたのお手伝いをしていただきありがとうございます。私は間違いなく両方の方法を使って自分自身をさらに教えるのに役立つだろう。それは多くの助けになっています。
追加された 著者 acrichm,