2012-06-28 20 views
8

Estoy tratando de comprobar si una base de datos SQLite está vacía utilizandoCompruebe si la base de datos está vacía

public boolean chkDB(){ 
     boolean chk = false; 
     Cursor mCursor = db.rawQuery("SELECT * FROM " + DATABASE_TABLE, null); 
     if (mCursor != null){ 
      mCursor.moveToFirst(); 
      if (mCursor.getInt(0) == 0){ 
       chk = false; 
      } 
     }else{ 
      chk = true; 
     } 
     return chk; 
    } 

pero cada vez que llamo a ese método me sale excepción de puntero nulo

Mi Logcat muestra este

06-28 22:35:19.519: E/AndroidRuntime(441): at com.android.id.DBAdapter.chkDB(DBAdapter.java:82) 
06-28 22:58:06.269: E/AndroidRuntime(621): FATAL EXCEPTION: main 
06-28 22:58:06.269: E/AndroidRuntime(621): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.id/com.android.id.MainActivity}: java.lang.NullPointerException 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.os.Looper.loop(Looper.java:123) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.app.ActivityThread.main(ActivityThread.java:4627) 
06-28 22:58:06.269: E/AndroidRuntime(621): at java.lang.reflect.Method.invokeNative(Native Method) 
06-28 22:58:06.269: E/AndroidRuntime(621): at java.lang.reflect.Method.invoke(Method.java:521) 
06-28 22:58:06.269: E/AndroidRuntime(621): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
06-28 22:58:06.269: E/AndroidRuntime(621): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
06-28 22:58:06.269: E/AndroidRuntime(621): at dalvik.system.NativeStart.main(Native Method) 
06-28 22:58:06.269: E/AndroidRuntime(621): Caused by: java.lang.NullPointerException 
06-28 22:58:06.269: E/AndroidRuntime(621): at com.android.id.DBAdapter.chkDB(DBAdapter.java:82) 
06-28 22:58:06.269: E/AndroidRuntime(621): at com.android.id.MainActivity.enterDB(MainActivity.java:66) 
06-28 22:58:06.269: E/AndroidRuntime(621): at com.android.id.MainActivity.onCreate(MainActivity.java:23) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
06-28 22:58:06.269: E/AndroidRuntime(621): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
06-28 22:58:06.269: E/AndroidRuntime(621): ... 11 more 
+0

Demostración usted LogCat y en lugar de 'mCursor = null', se puede usar' mCursor.getCount)> 0' –

+0

@darkcrow añadió (logcat – MohamedAli

+0

bien, muéstrame más código de 'DBAdapter' –

Respuesta

6
if(mCursor.getCount() == 0) 

debe hacer el truco

+0

sigue siendo el mismo problema – MohamedAli

11

mCursor.moveToFirst() Devuelve un valor booleano de si encontró un elemento correctamente o no. Úselo para moverse a la primera fila en el cursor y al mismo tiempo verifique si realmente existe una fila.

Cursor mCursor = db.rawQuery("SELECT * FROM " + DATABASE_TABLE, null); 
Boolean rowExists; 

if (mCursor.moveToFirst()) 
{ 
    // DO SOMETHING WITH CURSOR 
    rowExists = true; 

} else 
{ 
    // I AM EMPTY 
    rowExists = false; 
} 

Está intentando acceder a una fila en el cursor, independientemente de si existe o no.

+0

** No **, no causará una 'NullPointerException' - arrojaría un error - un' CursorIndexOutOfBoundsException' – Jens

+2

sigue siendo el mismo problema – MohamedAli

+0

Debe ser su variable db. Todo lo demás funcionaría. ¿Cómo lo estás inicializando? Recomiendo estructurar su código de esta manera para evitar más errores. Y pasando, usando 'Cursor.moveToNext' – Doomsknight

0

Configurar una consulta de método (ya sea en su ContentProvider directamente) o en otra clase usando su ContentResolver con una proyección de una columna (ID debe hacer el truco). Luego vea si el cursor contiene algo o no.

lo hice fuera del ContentProvider en una clase de tarea:

//Is database empty? 
public static boolean isDbEmpty(Context context) { 
    ContentResolver contentResolver = context.getContentResolver(); 

    String[] projection = new String[] {#_ID#}; 

    Cursor csr = checkResolver.query(#CONTENT_URI#, projection, null, 
      null, null); 
    if (csr != null && csr.moveToFirst()) { 
     csr.close(); 
     return false; 
    } else { 
     return true; 
    } 
} 
Cuestiones relacionadas