android.database.sqlite.SQLiteConstraintException: エラー コード 19: 制約に失敗しました
したがって、ROLLNO
isPK
であるため、2 つの行が同じになることはできないという一意の制約が暗黙的に追加されますPK
。主キーは常にする必要がありますUNIQUE
。
挿入する前に、主キーであるため、FIELD_ROLLNOに重複したrollNoを挿入しないようにユーザーを制限したいと思います。
したがって、これはいくつかの方法で解決できます。おそらく、アプリケーション層で修正し、重複/不正な値が追加された場合にユーザーにメッセージを表示する必要があります。したがって、私の最初のアイデアは、テーブルからすべてを返すメソッドを作成する必要がありROLLNOs
(たとえば、それらをいくつかのコレクションに保存する必要がありますList
)、挿入を実行する前に EditTexts データのチェックを開始することです。ROLLNO
まず、EditText とdbを比較しROLLNOs
、結果に応じて警告を表示するToast
か、適切なアクションを実行する必要があります。
また、ユーザーが任意のフィールドに null レコードを挿入している場合は、ダイアログ ボックスでユーザーの注意を喚起したいと考えています。
あなたはからの値を使用していると述べた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();
}
}
}
アクティビティでの使用法:
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;
}
私が「たった今」書いたこれらのコードのスニペットは、個人的な要件のために改善することもできます。それはあなたの問題を解決するはずです。見てみな。