PDA

Ver la Versión Completa : No such table column "Telefono" Sqlite android


Betico92
23/11/13, 23:40:00
Muy buenas! Encantado de haberme registrado e intentar ayudar y poner mi granito de arena en todo lo que pueda! , Sin mas contemplaciones os traigo un problema que llevo varios dias estancado y no consigo dar con la solucion.. estoy desesperado y tengo que entregar el proyecto en breve.

Dada mi inexperiencia en este mundo que estoy entrando os comento de que va el tema.

El proyecto trata de realizar una aplicación como una "agenda" en la cual yo inserto un usuario con una serie de datos rellenados en text view, y que me aparezcan en un list view.

Hasta ahí todo bien, yo rellenaba 3 campos que eran Nombre Apellido y Edad para comprobar que me lo hacia correctamente y hasta ahí todo funcionaba de maravilla. Es ahí cuando inserté otro campo llamado "Telefono" el cual es el causante de que la aplicación me falle. Me sale el siguiente error: INSERT INTO Personas has not column named Telefono.

No encuentro forma de arreglar ese error y ya son varios dias los que llevo.. os pongo el código a ver si podeis encontrar el fallo.. Muchísimas gracias a todo el mundo de antemano! Smile

public class DatabaseHandler extends SQLiteOpenHelper{
// Ruta por defecto de las bases de datos en el sistema Android.
private static String RUTA_BASE_DATOS = "/data/data/proyectoMiguel.pruebabasedatos/databases/";

// Nombre de la Base de Datos.
private static String NOMBRE_BASE_DATOS = "prueba";

// Version de la Base de Datos.
private static final int VERSION_BASE_DATOS = 2;

// Objeto Base de Datos.
private SQLiteDatabase base_datos;

// Objeto Contexto.
private Context contexto;

// Constante privada
private String SENTENCIA_SQL_CREAR_BASE_DATOS_PERSONAS = "CREATE TABLE if not exists personas (_id INTEGER PRIMARY KEY autoincrement, " +
"nombre TEXT, apellido TEXT, edad TEXT, telefono TEXT, ruta_imagen TEXT)";

/**
* Constructor
* Toma referencia hacia el contexto de la aplicación que lo invoca para poder acceder a los 'assets' y
* 'resources' de la aplicacion.
* Crea un objeto DBOpenHelper que nos permitirá controlar la apertura de la base de datos.
* @param context
*/
public DatabaseHandler(Context context) {
super(context, NOMBRE_BASE_DATOS, null, VERSION_BASE_DATOS);
this.contexto = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
// Se ejecuta la sentencia SQL de creación de la tabla personas.
db.execSQL(SENTENCIA_SQL_CREAR_BASE_DATOS_PERSONAS );
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Se elimina la versión anterior de la tabla Personas.
db.execSQL("DROP TABLE IF EXISTS Personas");

// Se crea la nueva version de la tabla personas.
db.execSQL(SENTENCIA_SQL_CREAR_BASE_DATOS_PERSONAS );
}

/**
* Metodo publico para insertar una nueva persona.
*/
public void insertarPersona(Persona persona){
ContentValues valores = new ContentValues();
valores.put("nombre", persona.getNombre());
valores.put("apellido", persona.getApellido());
valores.put("edad", persona.getEdad());
valores.put("telefono",persona.getTelefono());
valores.put("ruta_imagen", persona.getRutaImagen());
this.getWritableDatabase().insert("Personas", null, valores);
}

/**
* Metodo publico que retorna una persona especifica.
* @param id
* @return
*/
public Persona getPersona(int p_id) {
String[] columnas = new String[]{"_id", "nombre", "apellido", "edad", "telefono", "ruta_imagen"};
Cursor cursor = this.getReadableDatabase().query("Personas", columnas, "_id" + "= " + p_id, null, null, null, null,null);

if (cursor != null){
cursor.moveToFirst();
}

Persona persona = new Persona(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3),
cursor.getString(4), cursor.getString(5));

// Retorna la persona especifica.
return persona;
}

/**
* Metodo publico que cierra la base de datos.
*/
public void cerrar(){
this.close();
}

/**
* Metodo publico que devuelve todas las personas.
* @return
*/
public Cursor obtenerTodasPersonas(){
//String[] columnas = new String[]{"_id", "nombre", "apellido", "edad", "telefono", "ruta_imagen"};
Cursor cursor = this.getReadableDatabase().rawQuery("select * from personas",null);
//Cursor cursor = this.getReadableDatabase().query("Personas", columnas, null, null, null, null, null, null);

if(cursor != null) {
cursor.moveToFirst();
}
return cursor;
}

----------------------------------------------------------------
Y en la clase donde inserto los datos tengo el siguiente metodo para insertar:

/**
* Metodo privado que insertar una nueva Persona.
*/
private void insertarNuevoPersona() {
baseDatos = new DatabaseHandler(EditarPersonaActivity.this);

try {
// Crear objeto Persona.
Persona persona = new Persona(editTextNombre.getText().toString(),
editTextApellido.getText().toString(), editTextEdad
.getText().toString(), editTextTelefono.getText().toString(), ruta_imagen);

// Se inserta una nueva persona.
baseDatos.insertarPersona(persona);
} catch (Exception e) {
mensaje.mostrarMensajeCorto("Error al insertar!!!");
e.printStackTrace();
} finally {
// Se cierra la base de datos.
baseDatos.cerrar();
}
}


Muchísimas gracias de antemano y perdón por mi inexperiencia en este gran mundo. Encantado de pertenecer a un foro tan grande como este! Un abrazo muy fuerte! :)

Betico92
23/11/13, 23:57:02
Todo solucionado! Era tan simple como desistalar la aplicación porque me estaba cargando la base de datos anterior..a veces las cosas mas tontas y simples son las que menos paramos a pensar que ocurre.. otra lección más, lo dejo puesto por si a alguien le ocurre un error similar! Un saludo! :)

kriogeN
24/11/13, 00:31:39
Cada vez que haces un cambio en el SQLite tienes que aumentar el número de versión de la base de datos, para que así cuando la aplicación se inicie se ejecute el onUpgrade.

Betico92
24/11/13, 12:39:22
Cada vez que haces un cambio en el SQLite tienes que aumentar el número de versión de la base de datos, para que así cuando la aplicación se inicie se ejecute el onUpgrade.

Ah pues lo desconocía, a partir de ahora lo haré cada vez que realice el cambio, perdón por la ignorancia, soy bastante novato jajajaja.

Muchas gracias por responder, un saludo!