所以我创建了一个表格
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,
在插入之前我想要假定用户不要在FIELD_ROLLNO
中插入重复的rollNo,因为它的主键。
如果用户在任何字段中插入空记录,我还希望用对话框引起用户注意。
我在FIELD_ROLLNO
coloumn。
Error inserting lname=Hussain roll_no=08cs18 fname=Qadir
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
我需要的是如何捕获此异常和空值异常,以便我可以向用户显示一个对话框。
答案 0 :(得分:3)
android.database.sqlite.SQLiteConstraintException:错误代码19: 约束失败
因为ROLLNO
是PK
,所以隐式添加了唯一约束,即没有两行可以具有相同的PK
。主键必须始终为UNIQUE
。
插入之前我想停止用户不要插入 在FIELD_ROLLNO中复制rollNo,因为它是主键。
所以这可以通过几种方式解决。您可能希望在应用程序层上修复它,如果添加了重复/不正确的值,则向User显示一些消息。所以我的第一个想法是你需要创建从表中返回所有ROLLNOs
的方法(你应该将它们存储到某个集合中,例如存储到List
),然后在执行插入之前开始检查EditTexts数据。首先,您需要将来自EditText的ROLLNO
与来自db的ROLLNOs
进行比较,并根据结果显示警告Toast
或执行相应的操作。
如果用户是,我想用对话框引起用户注意 在任何字段中插入空记录。
您提到您正在使用EditText
中的值,因此您可以通过“constrait”来确定这一点
“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();
}
}
}
活动中的用法:
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;
}
我刚才写的这些代码片段也因个人要求而得到改善。它应该解决你的问题。看看吧。
答案 1 :(得分:2)
您应该使用insertOrThrow并捕获异常。
try
{
returnedValue = db.insertOrThrow(TABLE_NAME, null, newEntry);
}
catch (SQLException e)
{
Log.e(DATABASE_NAME, e.toString());
}