2011-08-28 86 views
22

我有這是由下面的代碼創建一個SQL表空:如何測試如果光標在一個SQLiteDatabase查詢

public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID 
     + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT 
     + " TEXT NOT NULL," + TOPIC + " TEXT NOT NULL, " 
     + LECTURENUMBER + " TEXT NOT NULL, " + PAGENUMBER 
     + " TEXT NOT NULL, " + DATE + " TEXT NOT NULL, " + _DATA 
     + " TEXT NOT NULL);"); 
} 

我查詢表如下:

String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
    + " GROUP BY " + SUBJECT + ";"; 

Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

問題是否必須在光標爲空(即表格不存儲值)時啓動活動A,如果光標不爲空(即表格已填充),則必須啓動活動B.

我無法找到一個方法,可以告訴我,如果表是空的或沒有。 我曾嘗試使用的日誌如下:

private void showSubjectsOnList() { 
    String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
     + " GROUP BY " + SUBJECT + ";"; 

    Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

    Log.d("Events",Integer.toString(cursor.getCount())); 
    if(cursor.isNull(0)!=false){ 
     cursor.close(); 
     subjects.close(); 
     startActivity(new Intent(this,OpenScreen.class)); 
    } 
} 

但日誌顯示1,如果表是空的...和1再次,如果表中有1項....它顯示2,如果表有兩個條目等等。

你能否提出一些解決我的問題的方法,根據遊標是否爲空來開始不同的活動。

回答

55

什麼測試光標這樣的,然後做你所說的話:

if(cursor!=null && cursor.getCount()>0) 

getCount將()

返回行數光標

http://developer.android.com/reference/android/database/Cursor.html#getCount()

+0

我還沒有嘗試完全按照你提到的方式。不過,我嘗試使用 光標= NULL 爲好,如下: Log.d(! 「活動」,Boolean.toString(光標= NULL)); 有趣的是,如果表中有一些值,則Log顯示爲true,但是如果表是空的,那麼令人驚訝的是日誌根本不顯示。我很困惑這是什麼意思。 –

+0

在測試之前,不要忘記將光標的指針移動到第一個帶有 'cursor.moveToFirst()'的記錄 –

+0

這意味着您的查詢返回零行。這意味着光標不爲空,但零行:D –

22

最簡單和清潔窩的方法來測試一個空光標是以下代碼:

if (cursor.moveToFirst()) { 
    // start activity a 
} else { 
    // start activity b 
} 

每該文檔,如果光標位於空該方法返回false:

http://developer.android.com/reference/android/database/Cursor.html#moveToFirst%28%29

公共抽象布爾moveToFirst( )

在API級別1中添加將光標移到第一行。

如果光標空此方法將返回false。

返回移動是否成功。

+0

嘗試,但不工作:s –

+0

cursor.moveToNext()...我認爲這將返回true如果有行,假,如果沒有找到行... –

+0

@KarueBensonKarue - 它也可能。看看文檔。 – SBerg413

0

我的建議是使用ListActivity

這些都是活動的,其是爲了顯示在ListView項目。您可以簡單地使用SimpleCursorAdapter來填充它們(也可以在ListActivity的JavaDoc頁面中進行說明)。

還提供一個setEmptyView()-method,可用於顯示View(可能是TextView),該通知用戶沒有記錄但他怎麼可以創建一個。

如何做到這一點的例子可以找到here

+0

親愛的Lukas Knuth, –

+1

...剩下的? –

+0

親愛的盧卡斯, 活動B實際上是listActivity。即使上面提到的方法showSubjectsOnList()也是這個Activity中的一個方法。如果遊標在ShowSubjectsOnList中爲空,我想要啓動Activity A,否則我想保持在同一活動中.....但是我無法找到如何找到那個遊標是空的。 –

1

你只需要使用getCount()。 如果你的SQL是正確的,但不返回任何行,你將有一個NOT null遊標對象,但沒有行,getCount()將返回0.

+0

請詳細說明。 –

+0

當您查詢數據庫時,光標對象總是返回。例如,它有你的查詢字符串。所以它不能爲空:在Java中 - 沒有「連接」到任何對象的標識符爲空。只有當您的選擇查詢沒有返回任何行時 - getCount()將返回零。 – Minolan

+0

嗯..感謝您的闡述。但是,我怎樣才能解決我的問題呢? –

0

我相信你的問題是你沒有創建一個合適的查詢。

您應該使用SQLiteDatabase查詢。

Cursor c = db.query(TABLE_NAME, null, 
      null, null, null, null, null); 

然後您可以使用c.getCount()來確定表是否有任何內容。

2

刪除的記錄在SQLite中保留爲空記錄,但getCount()只計數非空記錄。如果您的表的某些記錄爲空,則某些非空記錄的_Id數字會比getCount()的結果大。爲了達到它們,你可以迭代遊標(使用for()循環)的次數比getCount()的結果多兩倍,並使用遊標將record_Id數字填充到數組中。可以說結果數組是{ 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }

這意味着記錄3,4,10,13是空記錄,並且您的表共有14條記錄,而不是您從getCount()獲得的10條記錄。

記住:

  1. getCount()收益的數量不爲空的記錄,
  2. 光標返回_Id數不爲空的記錄,
  3. _Id號 「錯過」 的光標是_Id數的空記錄,
  4. 必須達到比getCount()足夠進一步得到他們全部。
相關問題