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; } 

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(); } 
  • No se puede actualizar el campo TextView dentro de RecyclerView
  • Mostrar el contenido de la base de datos sqlite en formato pdf en android
  • Utilización de la base de datos legible y escrita de SQLite
  • Android - ¿SimpleCursorAdapter permite múltiples diseños como BaseAdapter?
  • Cómo puedo limitar el número de filas en la tabla SQLite de Android
  • Diferencia entre las funciones window.openDatabase () y window.sqlitePlugin.openDatabase ()?
  • ¿Cómo acceder a la base de datos sqlite existente en Android Emulator?
  • Java.lang.StringIndexOutOfBoundsException: index = 0 length = 0 en obtener la base de datos sqlite
  • ¿Por qué onUpgrade () no está siendo invocado en la base de datos Android sqlite?
  • GreenDao consultas profundas con relaciones n: m
  • Sugar ORM lanza excepción NoSuchTable en lollipop
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.