我正在尝试在数据库上插入一些值,但它不起作用(应用程序给我一个SQLliteConstraintException 19:约束失败)。我已经阅读了很多关于这一点(在大多数情况下是由重复键引起的,但我认为这不是我的情况)。这是我的DBHelper代码:
public class DBHelper {
public static final String DB_NAME = "proyecto";
public static final String DB_TABLE = "usuarios";
public static final int DB_VERSION = 3;
private static final String CLASSNAME = DBHelper.class.getSimpleName();
private static final String[] COLS = new String[] { "_id", "login", "password", "nombre", "apellidos", "n_voluntario" };
private static final String LOGTAG = null;
private SQLiteDatabase db;
private final DBOpenHelper dbOpenHelper;
//
// inner classes
//
public static class Usuario {
public long id;
public String login;
public String password;
public String nombre;
public String apellidos;
public int n_voluntario;
public Usuario() {
}
public Usuario(final long id, final String login, final String password, final String nombre,
final String apellidos, final int n_voluntario) {
this.id = id;
this.login = login;
this.password = password;
this.nombre = nombre;
this.apellidos = apellidos;
this.n_voluntario = n_voluntario;
}
/*@Override
public String toString() {
return this.zip + " " + this.city + ", " + this.region;
}*/
}
private static class DBOpenHelper extends SQLiteOpenHelper {
private static final String DB_CREATE = "CREATE TABLE "
+ DBHelper.DB_TABLE
+ " (_id INTEGER PRIMARY KEY, login TEXT, password TEXT, nombre TEXT, apellidos TEXT, n_voluntario INTEGER);";
public DBOpenHelper(final Context context) {
super(context, DBHelper.DB_NAME, null, DBHelper.DB_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase db) {
try {
db.execSQL(DBOpenHelper.DB_CREATE);
} catch (SQLException e) {
Log.e(LOGTAG, DBHelper.CLASSNAME, e);
}
}
@Override
public void onOpen(final SQLiteDatabase db) {
super.onOpen(db);
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + DBHelper.DB_TABLE);
onCreate(db);
}
}
//
// end inner classes
//
public DBHelper(final Context context) {
this.dbOpenHelper = new DBOpenHelper(context);
establishDb();
}
private void establishDb() {
if (this.db == null) {
this.db = this.dbOpenHelper.getWritableDatabase();
}
}
public void cleanup() {
if (this.db != null) {
this.db.close();
this.db = null;
}
}
public long insert(final Usuario usuario) {
ContentValues values = new ContentValues();
values.put("login", usuario.login);
values.put("password", usuario.password);
values.put("nombre", usuario.nombre);
values.put("apellidos", usuario.apellidos);
values.put("n_voluntario", usuario.n_voluntario);
return this.db.insert(DBHelper.DB_TABLE, null, values);
}
public void update(final Usuario usuario) {
ContentValues values = new ContentValues();
values.put("login", usuario.login);
values.put("password", usuario.password);
values.put("nombre", usuario.nombre);
values.put("apellidos", usuario.apellidos);
values.put("n_voluntario", usuario.n_voluntario);
this.db.update(DBHelper.DB_TABLE, values, "_id=" + usuario.id, null);
}
public void delete(final long id) {
this.db.delete(DBHelper.DB_TABLE, "_id=" + id, null);
}
public void delete(final String login) {
this.db.delete(DBHelper.DB_TABLE, "login='" + login + "'", null);
}
public Usuario get(final String login) {
Cursor c = null;
Usuario usuario = null;
try {
c = this.db.query(true, DBHelper.DB_TABLE, DBHelper.COLS, "login = '" + login + "'", null, null, null, null,
null);
if (c.getCount() > 0) {
c.moveToFirst();
usuario = new Usuario();
usuario.id = c.getLong(0);
usuario.login = c.getString(1);
usuario.password = c.getString(2);
usuario.nombre = c.getString(3);
usuario.apellidos = c.getString(4);
usuario.n_voluntario = c.getInt(5);
}
} catch (SQLException e) {
Log.v(LOGTAG, DBHelper.CLASSNAME, e);
} finally {
if (c != null && !c.isClosed()) {
c.close();
}
}
return usuario;
}
}
有什么想法吗?
感谢您的回答。
答案 0 :(得分:0)
在SQLite的Android实现中,是否将PK定义为INTEGER PRIMARY KEY时创建的自动递增键?或者您是否需要添加AUTOINCREMENT作为PK定义的一部分?
答案 1 :(得分:0)
违反完整性约束时引发SQLliteConstraintException异常。您已在“usuarios”表中将“_id”字段声明为主键。通过执行此操作,您将在“_id”列上添加约束。但是,当您插入时,您不提供“_id”的值。有2个解决方案:
更改
private static final String DB_CREATE = "CREATE TABLE " +
DBHelper.DB_TABLE + " (_id INTEGER PRIMARY KEY, login TEXT, password
TEXT, nombre TEXT, apellidos TEXT, n_voluntario
INTEGER);";
到
private static final String DB_CREATE = "CREATE TABLE "+ DBHelper.DB_TABLE
+ " (_id INTEGER PRIMARY KEY AUTOINCREMENT, login TEXT, password TEXT,
nombre TEXT, apellidos TEXT, n_voluntario INTEGER);";
希望它能解决你的问题!!如果没有,请在这里转储堆栈跟踪!!
干杯!!