2013-03-10 53 views
0

當我的數據庫是空的,或者它剛剛創建我收到此錯誤,使用光標從SQLite的返回行,錯誤時,數據庫是空

03-10 17:34:40.758: E/AndroidRuntime(1144): java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.example.adressbooktake2/com.example.adressbooktake2.MainActivity}: android.database.CursorIndexOutOfBoundsException:索引0請求,大小的0

這是我的代碼在我的主類

public class MainActivity extends Activity { 
    DBAdaptor db; 
    Cursor cursor; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     db = new DBAdaptor(this).open();   
     cursor = db.getAllRecords(); 

     DisplayRecord(cursor); 

} 

,然後在我的DBAdaptor類調用此代碼,

public Cursor getAllRecords() 

    {  
     Cursor gaRecords = db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, 
         KEY_PHONENUMBER, KEY_EMAIL}, null, null, null, null, null);  


     gaRecords.moveToFirst(); 

     return gaRecords; 

    } 

} 

我相信這個問題是數據庫剛剛創建的時候,沒有地方了moveToFirst()去,作爲沒有數據。但我不知道如何繞過這一點,因爲我需要一個moveToFirst()來存儲數據庫。

任何人都看到解決方案嗎?有正確的診斷問題嗎?

回答

1

您可以檢查這樣一個空光標:

... 
cursor = db.getAllRecords(); 
if(cursor.getCount() > 0) 
    DisplayRecords(cursor); 
else 
    DisplayNoRecordsMessage(); 

或者因爲你前一個問題貼DisplayRecords(),你也可以使用:

... 
if (c != null && !cursor.isAfterLast()) 
{ 
    nameTxt.setText(c.getString(1)); 
    phoneTxt.setText(c.getString(2)); 
    emailTxt.setText(c.getString(3)); 
} 

也請閱讀Java naming convention其中規定該方法名稱應該以小寫字母開頭。

+0

這整理吧!但我不明白爲什麼。是否因爲它只在光標上傳遞,如果它大於0?它在0時會發生什麼?它只是被遺忘了嗎? – user2153547 2013-03-10 17:54:28

+0

@ user2153547確切地說,當'getCount()== 0'時,你的代碼將不會調用'DisplayRecords()',當有行時它們將逐一顯示。 – Sam 2013-03-10 17:57:53

+1

@ρяσѕρєяK作者只想一次顯示一條記錄,我從之前的問題知道這一點。 :)(這就是爲什麼我沒有使用'moveToFirst()'。) – Sam 2013-03-10 17:59:03

0

Cursor.moveToFirst()在空遊標的情況下返回false。

看到該文檔:http://developer.android.com/reference/android/database/Cursor.html#moveToFirst()

我想說的問題是DisplayRecord()。

你是否從DisplayRecord()中的光標中獲取數據?如果是這樣的話,你應該檢查光標是否包含一些數據,例如調用moveToFirst並檢查其結果。

喜歡的東西

private void DisplayRecord(Cursor c){ 
    if(!c.moveToFirst()){ 
     return; 
    } 
    // do stuff 
} 
0

如果使用(光標.moveToFirst())來檢查光標

public class MainActivity extends Activity { 
    DBAdaptor db; 
    Cursor cursor; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     db = new DBAdaptor(this).open();   
     cursor = db.getAllRecords(); 

     if(cursor.moveToFirst()){ 
      DisplayRecord(cursor); 
      } 


}