A la tabla SQLite de Android le falta una columna

La aplicación interactúa con las clases de PHP para obtener datos de MySQL y usa SQLite para almacenar datos de usuario en el dispositivo, pero me da mensajes de error. ¿Podría alguien amablemente ayudarme a arreglar?

Controlador de base de datos.java

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "sqliteData";

    // Login table name
    private static final String TABLE_LOGIN = "login";

    // Login Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_ROLE = "role";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
                + KEY_ID + " INTEGER PRIMARY KEY," 
                + KEY_NAME + " TEXT," 
                + KEY_ROLE + " TEXT" + ")";

        db.execSQL(CREATE_LOGIN_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);

        // Create tables again
        onCreate(db);
    }

    /**
     * Storing user details in database
     * */
    public void addUser(String id, String name, String role) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_ID, id); // id
        values.put(KEY_NAME, name); // Name
        values.put(KEY_ROLE, role); // Role

        // Inserting Row
        db.insert(TABLE_LOGIN, null, values);
        db.close(); // Closing database connection
    }

    /**
     * Getting user data from database
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String,String> user = new HashMap<String,String>();
        String selectQuery = "SELECT  * FROM " + TABLE_LOGIN;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
            user.put("id", cursor.getString(1));
            user.put("name", cursor.getString(2));
            user.put("role", cursor.getString(3));
        }
        cursor.close();
        db.close();
        // return user
        return user;
    }

    /**
     * Getting user login status
     * return true if rows are there in table
     * */
    public int getRowCount() {
        String countQuery = "SELECT  * FROM " + TABLE_LOGIN;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int rowCount = cursor.getCount();
        db.close();
        cursor.close();

        // return row count
        return rowCount;
    }

    /**
     * Re crate database
     * Delete all tables and create them again
     * */
    public void resetTables(){
        SQLiteDatabase db = this.getWritableDatabase();
        // Delete All Rows
        db.delete(TABLE_LOGIN, null, null);
        db.close();
    }

}

LogCat

E/JSON(373): {"tag":"login","success":1,"error":0,"id":"013","user":{"name":"Mike Burton","role":"Developer"}}

I/Database(373): sqlite returned: error code = 1, msg = table login has no column named role

E/Database(373): Error inserting id=013 role=Developer name=Mike Burton

E/Database(373): android.database.sqlite.SQLiteException: table login has no column named role: , while compiling: INSERT INTO login(id, role, name) VALUES(?, ?, ?);

preguntado el 12 de junio de 12 a las 20:06

Si has alterado CREATE_LOGIN_TABLE en cualquier momento, debe eliminar explícitamente las tablas antiguas y crear otras nuevas. Una de las maneras más fáciles de hacer esto es sumando 1 a DATABASE_VERSION. -

También tienes una inyección de sql puesta anything' OR '1'='1 en el campo de contraseña. -

1 Respuestas

Parece que podría haber modificado el esquema pero no aumentado la versión (por lo que la base de datos no se reconstruyó con sus cambios). Si ese es el caso, puede eliminar/reinstalar su aplicación o incrementar la versión de la base de datos para que onUpgrade se llama.

Respondido el 12 de junio de 12 a las 20:06

@tvdog. ¡Estupendo! Si pudiera aceptar la respuesta (haga clic en la marca de verificación), sería genial. Eso les permite a todos saber que su problema está resuelto y le da crédito a la persona que lo ayudó. - Barak

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.