【问题标题】:Android SQLite: entry validating/checkingAndroid SQLite:条目验证/检查
【发布时间】:2011-11-25 07:53:51
【问题描述】:

希望有人能对此有所启发,让我帮忙。我有一个 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 语句使用 wither 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;
    }       
}

这可能是一个简单的修复,但我没有看到它...感谢任何帮助或洞察我可能做错了什么

【问题讨论】:

  • 你不觉得,如果你在哪里弹出一个对话框,你已经互换了东西吗?我的意思是,你应该检查一下,if(l==0){//number not exists in db}else{//number exists } 你做了反向...不是吗?
  • 啊,我完全忘记了要更改它,感谢您指出这一点
  • (在退出 #dbCheck(int) 方法之前,您还应该调用 Cursor#close()

标签: android sqlite android-2.2-froyo


【解决方案1】:

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;

  }       

}

【讨论】:

  • 太棒了……谢谢你们的帮助。我肯定会使用这两种方式来帮助自学更多。帮助很大。
【解决方案2】:

首先,重写 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()

【讨论】:

  • eclipse 在这个游标上抛出错误 c = ourDB.query(s, null);
  • 对不起,应该是rawQuery()
  • 太棒了……谢谢你们的帮助。我肯定会使用这两种方式来帮助自学更多。帮助很大。
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多