SQLite de Android CursorIndexOutOfBounds
Por alguna razón cuando no se encuentra el nombre de usuario I de entrada, la aplicación se bloquea. Pero cuando se encuentra el nombre de usuario parece funcionar perfecto. Incluso hago un cheque para ver si el cursor devuelto == null. Aquí está el código
public boolean isUserAuthenticated(String username, String password) { // TODO Auto-generated method stub boolean authenticated = false; String[] columns = new String[] {LOGIN_USERNAME, LOGIN_PASSWORD}; String sqlUsername = "\"" + username + "\""; Cursor c = ourDatabase.query(LOGIN_TABLE, columns, LOGIN_USERNAME + "="+ sqlUsername, null, null, null, null); if (c != null) { c.moveToFirst(); String passwordAttachedToUsername = c.getString(1); if(passwordAttachedToUsername.equals(password)) { authenticated = true; } } return authenticated; }
- Tipos de datos utilizados en SQLite
- ¿Qué técnica de almacenamiento de datos Android utilizar?
- Estrategia para actualizar la aplicación de Android (con base de datos)
- Adaptador de cursor y ejemplo sqlite
- Citas simples en sqlite en android
- La base de datos SQLite de Android está bloqueada
- AsyncTask de Android y instancia de SQLite DB
- Error No se puede realizar esta operación porque se ha cerrado el grupo de conexiones
- SQLCipher para Android: icudt46l.zip realmente necesario?
- SQLite - No se pudo abrir el archivo de base de datos
- Android sqlLite ON CONFLICT IGNORE se ignora en ICS
- ¿Cómo recuperar un ID del elemento seleccionado en un Spinner dinámico?
- No se puede eliminar la columna de la tabla sqlite
Su objeto Cursor no puede ser nulo, pero el tamaño de su conjunto de resultados es 0. En lugar de:
if (c != null) { ... }
tratar:
if (c.getCount() > 0) { ... }
Además, como @mu es demasiado corto mencionado, sólo podría utilizar el valor devuelto de c.moveToFirst () en su condicional:
if (c.moveToFirst()) { String passwordAttachedToUsername = c.getString(1); if (passwordAttachedToUsername.equals(password)) { authenticated = true; } }
En primer lugar, la condición debe ser:
if (c != null && c.getCount() > 0)
En segundo lugar, se puede refactorizar
String passwordAttachedToUsername = c.getString(1); if(passwordAttachedToUsername.equals(password)) { authenticated = true; }
con esto en su lugar:
authenticated = password.equals(c.getString(1));
Cambio:
if (c != null) { c.moveToFirst(); ... }
a
if (c != null && c.moveToFirst()) { ... }
que devolverá true si c != null
y el tamaño del cursor es mayor que 0.
El comando de query
siempre devolverá un cursor para que su prueba de nulo siempre falle. Usted necesita comprobar el conteo que el cursor contiene usando cursor.getCount()
if (cursor != null && cursor.getCount() > 0) { if (c.moveToFirst()) { String passwordAttachedToUsername = c.getString(1); if(passwordAttachedToUsername.equals(password)) { authenticated = true; }} // your logic goes here } else { Toast.makeText(getApplicationContext(), "No Record Found", 1000).show(); }
- Creación de CustomViews como un componente modular y reutilizable que se puede utilizar en todos los proyectos
- Tratando de tener un Receptor Broadcast sin filtro