android.database.sqlite.SQLiteConstraintException:错误代码19:约束失败
因此,既然ROLLNO
是PK
,就隐含地添加了唯一约束,即没有两行可以具有相同的约束PK
。主键必须始终为UNIQUE
.
在插入之前,我想限制用户不要在 FIELD_ROLLNO 中插入重复的 rollNo,因为它的主键。
所以这可以通过几种方式解决。如果添加了重复/不正确的值,您可能希望在应用层修复它并向用户显示一些消息。所以我的第一个想法是,您需要创建ROLLNOs
将从表中返回所有内容的方法(您应该将它们存储到某个集合中,例如 to List
),然后在执行插入之前开始检查 EditTexts 数据。首先,您需要将ROLLNO
EditText 与ROLLNOs
db 进行比较,并根据结果显示警告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;
}
我“刚刚”编写的这些代码片段也可以根据个人需求进行改进。它应该可以解决您的问题。看看这个。