2011-07-18 57 views
1

我試圖插入一些數據庫的值,但它不起作用(應用程序給我一個SQLliteConstraintException 19:約束失敗)。我讀過很多關於這個(在大多數情況下是由雙重鍵引起的,但我認爲這不是我的情況)。這裏是我的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. 簡單的方法

變化

 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」,其相應的值確保你把一個唯一的值f或「_id」,否則它將被拒絕。

希望它能解決您的問題!如果沒有,請在這裏轉儲堆棧跟蹤!

乾杯!

+0

你的問題解決了嗎? – Ash

+0

對不起,回答一年後的XD,但是,它解決了。 – Luis

0

在Android的SQLite實現中,是在將PK定義爲INTEGER PRIMARY KEY時創建的自動增量密鑰?或者你需要添加AUTOINCREMENT作爲PK定義的一部分嗎?

相關問題