2012-06-28 144 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; 
    } 
}