我已经阅读了与此异常相关的大多数问题,但没有一个是明确的或说明为什么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);
答案 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.第二次,我为密码列添加了一个值,但由于传递的值不正确,所以它为空。
因此,我从本练习中推断出,没有列允许空值。你必须用一些值初始化它们。
如果我错了,请随时评论/添加或更正我。我希望其他任何人都能清楚地了解这个问题,因为没有关于这个例外的好文档。