0

所以我创建了一个表

String createTable = "CREATE TABLE " + TABLE_NAME + "(" + FIELD_FNAME
            + " TEXT NOT NULL," + FIELD_LNAME + " TEXT NOT NULL,"
            + FIELD_ROLLNO + " TEXT NOT NULL PRIMARY KEY" + ")";

    db.execSQL(createTable);

注意:FIELD_FNAME, FIELD_LNAME,FIELD_ROLLNO不为空,FIELD_ROLLNO也是主键。

i m inserting values in this table from `EditTexts` on a clickEvent of a button,

在插入之前,我想限制用户不要插入重复的 rollNo,FIELD_ROLLNO因为它的主键。

如果用户在任何字段中插入空记录,我还想通过对话框引起用户注意。

我在列中的重复条目上遇到此异常FIELD_ROLLNO

Error inserting lname=Hussain roll_no=08cs18 fname=Qadir
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

我只需要如何捕获此异常和空值异常,以便向用户显示对话框。

4

2 回答 2

3

android.database.sqlite.SQLiteConstraintException:错误代码19:约束失败

因此,既然ROLLNOPK,就隐含地添加了唯一约束,即没有两行可以具有相同的约束PK。主键必须始终为UNIQUE.

在插入之前,我想限制用户不要在 FIELD_ROLLNO 中插入重复的 rollNo,因为它的主键。

所以这可以通过几种方式解决。如果添加了重复/不正确的值,您可能希望在应用层修复它并向用户显示一些消息。所以我的第一个想法是,您需要创建ROLLNOs将从表中返回所有内容的方法(您应该将它们存储到某个集合中,例如 to List),然后在执行插入之前开始检查 EditTexts 数据。首先,您需要将ROLLNOEditText 与ROLLNOsdb 进行比较,并根据结果显示警告Toast或执行适当的操作。

如果用户在任何字段中插入空记录,我还想通过对话框引起用户注意。

您提到您正在使用来自的值,EditText因此您可以通过“约束”来确定这一点

“EditText 不能为空,需要填写”

例子:

public List<String> getRolls() {
   List<String> collection = new ArrayList<String>();
   String rollno = null;
   Cursor c = null;
   try {
      db = DbHelper.getReadableDatabase();
      String query = "select " + FIELD_ROLLNO + " from TableName";
      c = db.rawQuery(query, null);
      if (c != null) {
         if (c.moveToFirst()) {
            do {
               rollno = c.getString(c.getColumnIndex(FIELD_ROLLNO));
               collection.add(rollno);
            } while (c.moveToNext());
         }
      }
   }
   finally {
      if (c != null) {
         c.close();
      }
      if (db != null) {
         db.close();
      }
   }
}

以及 Activity 中的用法:

List<String> collection = dbHelper.getRolls();
String rollnoBox = editText1.getText().toString();
if (!isDuplicate(collection, rollnoBox)) {
   if (!TextUtils.isEmpty(editText2.getText().toString()) {
      // make insertion
   }
   else {
      Toast.makeText(this, "This cannot be empty!", Toast.LENGTH_SHORT).show();
   }
}
else {
   Toast.makeText(this, "Your rollno already exists!", Toast.LENGTH_SHORT).show();
}

private boolean isDuplicate(List<String> col, String value) {
   boolean isDuplicate = false;   
   for (String s: col) {
      if (s.equals(value) {
         isDuplicate = true;
         break;
      }
   }
   return isDuplicate;
}

我“刚刚”编写的这些代码片段也可以根据个人需求进行改进。它应该可以解决您的问题。看看这个。

于 2013-03-30T20:56:26.070 回答
2

您应该使用insertOrThrow并捕获异常。

try
{
  returnedValue = db.insertOrThrow(TABLE_NAME, null, newEntry);
} 
catch (SQLException e)
{
  Log.e(DATABASE_NAME, e.toString());
}
于 2013-03-30T20:46:28.303 回答