2011-07-12 6 views
0

この例外に関するほとんどの質問を読んでいますが、db.insertがこのエラーをスローする理由を明確に示していません。 DDMSから手動でdbを削除するまで、エラーなしでうまく動作していました。私SQLiteOpenHelperコードを以下に示します。sqliteconstraintexceptionエラー19の制約を与えるdb.insert()が失敗したのはなぜですか?

public class LoginSQLiteOpenHelper extends SQLiteOpenHelper { 

public static final String DB_NAME = "logincredentials.sqlite"; 
public static final int DB_VERSION_NUMBER = 1; 
public static final String DB_TABLE_NAME = "credentials"; 
public static final String USERNAME = "user_name"; 
public static final String PASSWORD = "password"; 

private static final String DB_CREATE_SCRIPT = "create table " + DB_TABLE_NAME + 
        "(_id integer primary key autoincrement," + 
        USERNAME + " text not null, " + 
        PASSWORD + " text not null);" ; 

public LoginSQLiteOpenHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION_NUMBER); 

} 

@Override 
public void onCreate(SQLiteDatabase aSqliteDB) { 
    Logger.d("Create", "Creating the database..."); 
    aSqliteDB.execSQL(DB_CREATE_SCRIPT); 
} 
} 

値を挿入するための私のコードは次のとおりです。

ContentValues contentValues = new ContentValues(); 
contentValues.put(LoginSQLiteOpenHelper.USERNAME, loginId); 
contentValues.put(LoginSQLiteOpenHelper.PASSWORD, password); 
database.insert(LoginSQLiteOpenHelper.DB_TABLE_NAME, null, contentValues); 
+0

スタックトレースを投稿できますか?データベース/テーブルが削除されていますか? –

答えて

0

私はかなりこの例外が発生した正確な理由を探しているすべてのフォーラムを読みました。しかし、それは明白にどこにも述べられていない。しかし、私のこのコードによって、私はなぜそれが私のために起こったのか説明することができます。

私が提供したコードスニペットは、実際には完璧です。私はdb.insert()を実行するために必要なものを正確に実行しています。

しかし、私は2つのステップで例外を考え出しました。 1.初めて値を挿入したとき、私は列のパスワードの値を挿入しませんでした。 2. 2回目に、「パスワード」の列の値を追加しましたが、誤った値の受け渡しによりnullでした。

したがって、私はこの練習から、ヌル値が許可されている列はないことを推論しました。それらをある値で初期化する必要があります。

私が間違っている場合は、私にコメントしてください。私は、この例外に関する良い文書がないので、この問題に取り組んでいる誰もがそれを明確にしたいと思います。

1

これが私に起こった理由です。データベースのCreate TableクエリでUNIQUEとして列名型の1つを宣言し、一意でない変数を挿入しようとすると、SQLiteConstraintExceptionエラーが発生します。

UNIQUE制約は、1つのテーブルにUNIQUE制約がいくつでも存在することを除いて、PRIMARY KEY制約に似ています。表のUNIQUE制約ごとに、各行にはUNIQUE制約で指定された列の値の固有の組合せが必要です。 PRIMARY KEY制約と同様に、UNIQUE制約の目的上、NULL値は他のすべての値(他のNULLも含む)とは異なると見なされます。 INSERTステートメントまたはUPDATEステートメントが、UNIQUE制約の対象となる列のセット内の同じ値を2つ以上の行に持つように表の内容を変更しようとすると、制約違反になります。ソース - http://www.sqlite.org/lang_createtable.html

関連する問題