2011-04-16 26 views
13

Tengo una aplicación ejecutándose con una tabla de trabajo llamada ANIMAL. Al crear esta tabla, consistía simplemente de columnas _id y nombre_animal.Dificultad para actualizar la tabla SQlite

Ahora estoy tratando de ampliar en él, incluyendo una columna animal_biography, sin embargo estoy teniendo un poco de difficulty.At principio pensé que era sólo un caso de actualizar mi declaración CREATE_TABLE para incluir la bio animales:

private static final String DATABASE_CREATE = 



      "create table " + ANIMALS_TABLE + 

      " (_id integer primary key autoincrement, " + 

      "animal_name text not null, " + 

      "biography text not null);"; 

sin embargo, mirando el logcat me dice que la biografía de la columna no existe cuando intento insertarla.

Ahora, he tratado de actualizar la base de datos mediante el uso de la onUpgrade() e incluyendo el código

db.execSQL("ALTER TABLE" + DATABASE_NAME); 
db.execSQL(DATABASE_CREATE); 

pero esto no es la solución del problema. ¿Alguien tiene alguna sugerencia sobre cómo solucionar este problema?

+0

Ok, he logrado encontrar una solución al problema. Necesitaba eliminar la base de datos de la aplicación para que creara una nueva tabla al inicio con el código revisado, eliminé la base de datos de la siguiente manera: Archivo dbFile = getDatabasePath ("Path_Name"); dbFIle.delete(); – Jnanathan

+0

Puede eliminar el archivo de la base de datos simplemente usando el explorador de archivos DDMS. – GrAnd

Respuesta

52

Si está usando SQLiteOpenHelper, es fácil actualizar una tabla. Debe implementar los métodos onCreate y onUpgrade y proporcionar la versión actual de su base de datos en el constructor de la clase. Al actualizar su tabla, simplemente incremente el número de versión de la base de datos, especifique una nueva consulta de creación de tabla en el método onCreate y ponga ALTER TABLE en el método onUpgrade para actualizar la versión anterior de la tabla. Cuando Android detecta que la versión de la base de datos no coincide, llamará automáticamente al método onUpgrade. Vea el ejemplo:

public class OpenHelper extends SQLiteOpenHelper { 

    private final static int DB_VERSION = 2; 

    public TracksDB(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     final String CREATE_TBL = 
      "create table " + ANIMALS_TABLE + 
      " (_id integer primary key autoincrement, " + 
      "animal_name text not null, " + 
      "biography text not null);"; 
      db.execSQL(CREATE_TBL); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion < 2) { 
      final String ALTER_TBL = 
       "ALTER TABLE " + ANIMALS_TABLE + 
       " ADD COLUMN biography text not null;"; 
      db.execSQL(ALTER_TBL); 
     } 
    } 
} 

Este método de actualización es la forma correcta de modificar tablas sin perder los datos del usuario, especialmente si la aplicación ha sido lanzado al público ya.

+0

genial, gracias por hacer las cosas más claras. – Jnanathan

+1

@GrAnd - gracias por su respuesta, eso ayudó mucho. Sin embargo, ese ejemplo no funcionará, ya que no puede agregar la columna "no nulo" sin especificar el valor predeterminado, como: "AGREGAR texto de biografía COLUMNA no nulo predeterminado default_biography" – Koger

+1

Tengo el mismo problema y ya he implementado el método anterior , Cambié el número de versión, log/debug también muestra que se llama a OnUpgrade, y no hay excepción (supongo que se han ejecutado correctamente las consultas). pero cuando intento cargar elementos (por el momento no hay registros, ya que he soltado la tabla y vuelto a crear) Todavía arroja una excepción, la nueva columna no existe. desinstalar la aplicación tampoco tiene ningún efecto. –

Cuestiones relacionadas