2012-06-28 145 views
8

我想檢查是否SQLite數據庫使用檢查是否數據庫是空的

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

但我每次調用該方法,我得到空指針異常時

我logcat中顯示了這種

是空的
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

顯示你logcat的和,而不是'mCursor = null',你可以使用'mCursor.getCount()> 0' –

+0

@darkcrow添加logcat – MohamedAli

+0

好吧,向我展示更多來自'DBAdapter'的代碼 –

回答

11

mCursor.moveToFirst()返回是否成功找到元素的布爾值。用它移動到遊標的第一行,同時檢查一行是否真的存在。

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

您試圖訪問遊標中的某一行,而不管是否存在該遊標。

+0

**無**,也不會引起一個'NullPointerException' - 這將拋出一個錯誤 - 一個'CursorIndexOutOfBoundsException' – Jens

+2

還是同樣的問題 – MohamedAli

+0

它必須是你的數據庫變量。其他一切都會奏效。你是如何初始化它的?無論如何,我建議像這樣構建代碼以防止出現更多錯誤。並通過循環,使用'Cursor.moveToNext' – Doomsknight

0

設置一個查詢的方法(無論是直接的ContentProvider的),或在另一個類使用ContentResolver的一個投影的一列(ID應該做的伎倆)。然後看看光標是否包含任何東西。

我在任務類這樣做的ContentProvider的外面!

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