为什么db.insert()给出了sqliteconstraintexception错误19约束失败

时间:2011-07-12 20:52:54

标签: android sqlite exception

我已经阅读了与此异常相关的大多数问题,但没有一个是明确的或说明为什么db.insert会抛出此错误。在我从DDMS手动删除数据库之前,它工作正常没有错误。以下是我的SQLiteOpenHelper代码:

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);

2 个答案:

答案 0 :(得分:1)

这就是我想到的原因。如果在数据库的Create Table查询中将一个列名类型声明为UNIQUE并尝试插入非唯一变量,则会调用SQLiteConstraintException错误。

UNIQUE约束类似于PRIMARY KEY约束,但单个表可能具有任意数量的UNIQUE约束。对于表上的每个UNIQUE约束,每行必须在UNIQUE约束标识的列中具有唯一的值组合。与PRIMARY KEY约束一样,出于UNIQUE约束的目的,NULL值被认为与所有其他值(包括其他NULL)不同。如果INSERT或UPDATE语句尝试修改表内容,以便两个或多个行在一组受UNIQUE约束约束的列中具有相同的值,则它是一个约束违例。来源 - http://www.sqlite.org/lang_createtable.html

答案 1 :(得分:0)

我已经阅读了几乎所有论坛,寻找发生此异常的确切原因。然而,它没有明确说明。但是,通过我的这个代码,我可以解释为什么它会出现在我身上。

我提供的代码片实际上是完美无缺的。我正在做db.insert()所需要的。

然而,我在两个步骤中找出了例外情况。 1.第一次插入值时,我没有为列密码插入值。 2.第二次,我为密码列添加了一个值,但由于传递的值不正确,所以它为空。

因此,我从本练习中推断出,没有列允许空值。你必须用一些值初始化它们。

如果我错了,请随时评论/添加或更正我。我希望其他任何人都能清楚地了解这个问题,因为没有关于这个例外的好文档。