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_FNAMEFIELD_LNAMEFIELD_ROLLNOは null ではなく、FIELD_ROLLNO主キーでもあります。

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

FIELD_ROLLNO挿入する前に、主キーであるため、ユーザーが重複した rollNo を挿入しないように制限したいと思います。

また、ユーザーが任意のフィールドに null レコードを挿入している場合は、ダイアログ ボックスでユーザーの注意を喚起したいと考えています。

列の重複エントリでこの例外が発生しFIELD_ROLLNOます。

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

必要なのは、この例外と null 値の例外をキャプチャして、ユーザーにダイアログを表示するにはどうすればよいかということだけです。

4

2 に答える 2

3

android.database.sqlite.SQLiteConstraintException: エラー コード 19: 制約に失敗しました

したがって、ROLLNOisPKであるため、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;
}

私が「たった今」書いたこれらのコードのスニペットは、個人的な要件のために改善することもできます。それはあなたの問題を解決するはずです。見てみな。

于 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 に答える