Android SQLite: проверка / проверка записей - PullRequest
1 голос
/ 25 ноября 2011

Надеясь, что кто-то сможет пролить немного света на это, чтобы я выручил. У меня есть поле EditText, где пользователь вводит серийный номер и / или ссылочный номер, а затем нажимает кнопку загрузки.

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

Я сделал способ проверить и посмотреть, был ли этот номер уже добавлен в базу данных. Если нет, то у меня появляется диалоговое окно «Да / Нет» с вопросом, хотят ли они добавить в базу данных. Затем, если он находится в БД, он загрузит данные этого числа в четыре 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();

Теперь с помощью метода, который я создал, я подумал, что все правильно, но что-то просто не работает. Я возвращаю целое число назад к коду кнопки загрузки, где оператор 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;
    }       
}

это может быть простое исправление, но я не вижу его ... спасибо за любую помощь или понимание того, что я могу делать неправильно

Ответы [ 2 ]

0 голосов
/ 25 ноября 2011

Во-первых, переписать dbCheck(), чтобы вернуть логическое значение, а не int.Нет смысла иметь int, если вы только возвращаете два значения, трата пространства.

Во-вторых, переписать свой запрос.Нет смысла выбирать все эти столбцы, если вы фильтруете только один из них, а затем отбрасываете результат.Перепишите его следующим образом:

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

Это сократит количество ошибок в вашем коде и поможет вам легче отладить его.

РЕДАКТИРОВАТЬ: исправлено query() вrawQuery().

0 голосов
/ 25 ноября 2011

c == ноль, если запрос выдает ошибку, в противном случае c! = Ноль, но 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;

  }       

}

...