2012-05-14 19 views
5

¿Cómo agrego una columna en DatabaseHelper onUpgrade y establezco filas preexistentes a un valor particular?¿Cómo agrego una columna en Ongrade y establezco las filas existentes a un valor particular?

me trataron:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    ... 
     if (oldVersion < 2) { 
      db.execSQL("ALTER TABLE " + MyTableName + " ADD COLUMN " 
       + MyNewColumn + " TEXT;");  
      db.execSQL("UPDATE " + MyTableName + " SET " + 
       MyNewColumn + "=" + "value for existing;"); 
     } 
    } 

Pero no creo que el altar se ha comprometido sin embargo, ya que dice que la columna no existe. ¿Cualquier sugerencia?

Editar: Se ha añadido un poco más de código que rodea

Editar: Mi error. Me faltaba una cita sobre la parte de valor y el error sobre ninguna columna me echó, pero el problema era que estaba buscando la columna para el valor que había utilizado sin la cita.

+0

OK - He hecho esto por mí mismo (echado de menos cotizaciones y así sucesivamente) . He eliminado mi respuesta, ya que podría ser engañosa para otros en el futuro. – Squonk

Respuesta

1

No es tan simple agregar una columna como lo ha mostrado, ya que la actualización se ejecutará cada vez que actualice la base de datos y la adición de la columna por segunda vez fallará ... Si desea hacerlo rápido y sucio puede envolver en un intento de captura

try { 
    db.execSQL("ALTER TABLE sometable ADD COLUMN newcolumn integer"); 
} 
catch(Exception e) { 
    e.printStackTrace(); 
} 

una mejor manera es mover todos los datos de la tabla en una tabla temporal, quitar y volver a crear la tabla y poner los datos de nuevo. Este es un ejemplo de algo que he usado antes

//Update old Table 
     if(DBVER< 1060){ 

      List<String> columns = DB.GetColumns(db, "listitems"); 
      db.execSQL("ALTER table listitems RENAME TO 'temp_listitems); ") ; 
      String tblListItems = "create table if not exists listitems " + 
        "(id integer primary key autoincrement, " + 
        "listid integer, " + 
        "itemid integer, " + 
        "qty integer, " + 
        "collected integer, " + 
        "qtytype integer, " + 
        "tabid integer); " ; 
      db.execSQL(tblListItems); 
      columns.retainAll(DB.GetColumns(db, "listitems")); 
      String cols = DB.join(columns, ","); 
      db.execSQL(String.format("INSERT INTO %s (%s) SELECT %s from temp_%s", "listitems", cols, cols, "listitems")); 
      db.execSQL("DROP table 'temp_" + "listitems"); 



     } 

Aquí hay un enlace http://www.devdaily.com/android/sqlite-alter-table-syntax-examples

0
db.execSQL("ALTER TABLE " + MyTableName + " ADD " 
      + MyNewColumn + " TEXT;"); 

Pruébalo sin Columna: sintaxis es:

ALTER TABLE [TABLE_NAME] ADD [COLUMN_NAME] DATATYPE

+0

** La sintaxis es: ALTER TABLE [TABLE_NAME] ADD [COLUMN_NAME] DATATYPE ** No que yo sepa. ¿Lo conseguiste de w3schools por casualidad? '... ADD COLUMN ...' es en realidad la sintaxis correcta. – Squonk

+0

no estoy familiarizado con SQL SERVER ... así que la siguiente sintaxis –

+0

Hmmm, OK. Acabo de volver a verificar los documentos de SQLite y está en lo cierto: 'ADD 'por sí solo está permitido, pero por lo general solo he visto' ADD COLUMN'. Obviamente, este no era el problema del OP sin embargo, y ahora lo han resuelto. – Squonk

Cuestiones relacionadas