SQLliteConstraintException问题:错误代码19

时间:2011-07-18 10:09:33

标签: android sqlite

我正在尝试在数据库上插入一些值,但它不起作用(应用程序给我一个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;
    }
}

有什么想法吗?

感谢您的回答。

2 个答案:

答案 0 :(得分:0)

在SQLite的Android实现中,是否将PK定义为INTEGER PRIMARY KEY时创建的自动递增键?或者您是否需要添加AUTOINCREMENT作为PK定义的一部分?

答案 1 :(得分:0)

违反完整性约束时引发SQLliteConstraintException异常。您已在“usuarios”表中将“_id”字段声明为主键。通过执行此操作,您将在“_id”列上添加约束。但是,当您插入时,您不提供“_id”的值。有2个解决方案:

  1. 简单方法
  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);";
    
    1. 插入值时,同时插入“_id”及其对应的值,确保为“_id”添加唯一值,否则将被拒绝。
    2. 希望它能解决你的问题!!如果没有,请在这里转储堆栈跟踪!!

      干杯!!