2011-07-18 7 views
1

データベースに値を挿入しようとしましたが、機能しません(アプリケーションがSQLliteConstraintException 19:制約に失敗しました)。私はこれについて多くを読んだことがあります(ほとんどの場合、二重引用符キーによって引き起こされますが、それは私のケースではないと思います)。 ID:DBHelperのID: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"の値を供給していません。 2解決策があります。

  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

AndroidのSQLiteの実装では、PKがINTEGER PRIMARY KEYとして定義されているときに作成される自動インクリメントキーですか?または、あなたはPK定義の一部としてAUTOINCREMENTを追加する必要がありますか?

関連する問題