2011-07-18 4 views
1

일부 값을 데이터베이스에 삽입하려고하지만 작동하지 않습니다 (응용 프로그램에서 SQLliteConstraintException 19 : 제약 조건 실패). 이것에 대해 많이 읽었습니다. (대부분의 경우 이중 키로 인해 발생하지만, 제 생각에는 그렇지 않습니다). 이드는 내 DBHelper 코드입니다.SQLliteConstraintException 문제 : 오류 코드 19

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

SQLliteConstraintException 무결성 제약 조건 위반시 예외가 발생합니다. "usuarios"테이블에서 "_id"필드를 기본 키로 선언했습니다. 이렇게하면 "_id"열에 대한 제한이 가해집니다. 그러나 삽입 할 때 "_id"값을 제공하지 않습니다. 이 솔루션이 있습니다

  1. 쉬운 방법

변화는 값을 삽입하는 동안, 또한 "_id"를 삽입하고

 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. 에 그 해당 값은 고유 한 값 f 그렇지 않으면 "_id"가 거부됩니다.

희망 사항은 당신의 문제를 해결하십시오! 그렇지 않다면 스택 추적을 여기에서 덤프하십시오 !!

건배 !!

+0

문제가 해결 되었습니까? – Ash

+0

1 년 후 XD에 답변 드려 죄송합니다. 예, 해결되었습니다. – Luis

0

안드로이드의 SQLite 구현에서, PK가 INTEGER PRIMARY KEY로 정의되면 자동 증가 키가 생성됩니까? 또는 AUTOINCREMENT를 PK 정의의 일부로 추가해야합니까?