Проблема с SQLliteConstraintException: код ошибки 19 - PullRequest
1 голос
/ 18 июля 2011

Я пытаюсь вставить некоторые значения в базу данных, но это не работает (приложение дает мне 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 голосов
/ 18 июля 2011

Исключение SQLliteConstraintException вызывается при нарушении ограничения целостности. Вы объявили поле "_id" в таблице "usuarios" в качестве первичного ключа. Делая это, вы накладываете ограничение на столбец "_id". Однако, когда вы вставляете, вы не указываете значение "_id". Есть 2 решения:

  1. Простой способ

изменить

        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», иначе оно будет отклонено.

Надеюсь, это решит вашу проблему !! Если нет, пожалуйста, сбросьте трассировку стека здесь !!

Ура !!

0 голосов
/ 18 июля 2011

В реализации SQLite для Android, создается ли автоинкрементный ключ, когда PK определен как INTEGER PRIMARY KEY? Или вам нужно добавить AUTOINCREMENT как часть определения PK?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...