es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Tipo de datos incompatible en la consulta con parámetros? (Java)

Actualmente estoy trabajando en una aplicación que utiliza una base de datos SQL para almacenar la información de cuenta de los usuarios (nombre de usuario, contraseña, etc.). En la aplicación, hay usuarios regulares y usuarios administradores. También estoy utilizando una consulta parametrizada, algo que todavía es nuevo para mí, para verificar el estado de administrador de un usuario. A continuación se muestra el método onCreate() para la tabla “users” (que es donde estoy almacenando la información del usuario).

public void onCreate(SQLiteDatabase myDB) {
    myDB.execSQL("create Table users(username Text primary key, password Text, email Text, phone Text, admin Integer, userID Text)");
}

Como puedes ver, la columna “admin” almacena un valor entero. En el contexto de mi aplicación, 0 indica un usuario no administrador y 1 indica un usuario administrador. Estoy utilizando una consulta parametrizada para verificar si un determinado usuario existe en la tabla “users” y también tiene el estado de administrador (si el entero en su columna “admin” es 1). A continuación se muestra el código para verificar si el usuario es un administrador.

// devuelve true si el usuario es un administrador, false si no es administrador
public boolean checkAdmin(String username) {
    SQLiteDatabase myDB = this.getWritableDatabase();
    Cursor cursor = myDB.rawQuery("select * from users where username = ? and admin = ?", new String[] {username,"1"});
    if (cursor.getCount()>0) // cursor > 0 si el usuario existe en la base de datos y tiene el estado de administrador
        return true;
    else
        return false;
}

Básicamente, la consulta SQL es simplemente “select * from users where username = username and admin = 1”, pero el problema que encuentro está en “new String[] {username,”1″}”. El parámetro “1” está subrayado en rojo y Android Studio me dice que el tipo requerido es String. Nuevamente, todavía soy nuevo en las consultas parametrizadas y estoy confundido acerca de por qué obtengo este error cuando el tipo de datos de “admin” es int.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    En las consultas parametrizadas, todos los parámetros se tratan como cadenas de texto. Puedes convertir el valor entero a una cadena de texto utilizando el método String.valueOf(). Por lo tanto, en tu caso, puedes modificar el método checkAdmin() de la siguiente manera:

    public boolean checkAdmin(String username) {
        SQLiteDatabase myDB = this.getWritableDatabase();
        Cursor cursor = myDB.rawQuery("SELECT * FROM users WHERE username = ? AND admin = ?", 
            new String[] {username, String.valueOf(1)});
        if (cursor.getCount() > 0)
            return true;
        else
            return false;
    }
    

    Aquí, String.valueOf(1) convertirá el valor entero 1 en una cadena de texto. Esto resolverá el problema de la línea roja subrayada y el mensaje de error.

Comments are closed.