2013-03-14 52 views
1

基本上我有一個從我的數據庫中填充listview的方法。我在問這個返回的遊標有問題嗎?

我收到遊標上的空指針和'無法停止活動'錯誤。

這是我如何返回我的光標:

public Cursor getAppointmentsData() { 
    String[] columns = new String[] { KEY_ROWAPPID, KEY_NAMEAPP, 
      KEY_TYPEAPP, KEY_TIMEAPP, KEY_DATEAPP, KEY_COMMENTAPP }; 
    Cursor c = ourDatabase.query(DATABASE_TABLEAPP, columns, null, null, 
      null, null, KEY_NAMEAPP + " ASC", null); 

    if (c != null) { 
     if (c.getCount() > 0 && c.moveToFirst()) 

     { 
      c.moveToFirst(); 

      return c; 

     } 

    } 
    c.close(); 
    return null; 
} 

當數據庫爲空,即沒有數據,它會崩潰......如果有數據它是好的。這讓我相信我從我的光標返回空值。

你們可以看到這種返回遊標的方法的問題嗎?

對不起,這個簡單的問題,但我撕開代碼之前,我想我會問這裏。

新編輯:

公共光標getAppointmentsData(){ 字符串[]列=新的String [] {KEY_ROWAPPID,KEY_NAMEAPP, KEY_TYPEAPP,KEY_TIMEAPP,KEY_DATEAPP,KEY_COMMENTAPP}; Cursor c = ourDatabase.query(DATABASE_TABLEAPP,columns,null,null, null,null,KEY_NAMEAPP +「ASC」,null);

if (c != null) { 

      c.moveToFirst(); 

     } 
    c.close(); 
    return c; 

} 

回答

1

你應該能夠只是做以下

if (c.moveToFirst()){ 
    return c; 
} 

這樣做的原因是,該query()方法不會返回空。它只會返回一個空的遊標。所以,沒有必要檢查它是否爲null。另外,如果moveToFirst()不能移動到第一行(因此,如果光標爲空),則它的計算結果爲false。所以,計數檢查是多餘的。

但是,您確定從您的方法返回null是否安全?如果沒有結果,則明確返回null。另外,你是否知道返回後永遠不會調用close()方法(如果你的遊標有結果)。

我不完全知道你用光標返回你的方法,但我建議你只是簡單地返回它。但我懷疑,你想要的是簡單

public Cursor getAppointmentsData() { 
    String[] columns = new String[] { KEY_ROWAPPID, KEY_NAMEAPP, 
      KEY_TYPEAPP, KEY_TIMEAPP, KEY_DATEAPP, KEY_COMMENTAPP }; 
    return ourDatabase.query(DATABASE_TABLEAPP, columns, null, null, 
      null, null, KEY_NAMEAPP + " ASC", null); 
} 

更新 - 關於何時關閉遊標

如果您關閉遊標,你回到它之前,則該方法getAppointmentsData()將返回關閉的遊標。我很確定這不是你以後的樣子。因爲在這個階段,你沒有使用光標,所以它現在還沒有清理自己:)

你以後是什麼樣的。首先,使用我上面建議的方法getAppointmentsData(),它不關閉遊標,它只是返回它。現在建立你的光標適配器這樣的事情

public CursorAdapter myCursorAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    //... all your stuff 
    myCursorAdapter = new CursorAdapter(this, getAppointmentsData()); 
} 

現在,光標適配器傳遞到您的ListView,在這個階段,ListView控件可以使用下面的光標(因爲它仍然生活,在不關閉:P )。然後,當你確定你的應用程序不再需要光標時,關閉它。當你的活動被破壞時,我建議這樣做

@Override 
public void onDestroy() { 
    myCursorAdapter.getCursor().close(); 
} 
+0

這是一個很好的解釋。我必須誠實地說,我沒有意識到,如果'if'stataement沒有被觸發,只需要返回一個空的遊標。我知道當我在方法的底部有返回類型'null'時,我正陷入麻煩。我會實現這一點,看看我如何繼續。我正在打開和關閉調用此遊標方法的類中的數據庫。 – user1352057 2013-03-14 01:20:07

+0

通過c.close()關閉我的遊標仍然是正確的? – user1352057 2013-03-14 01:23:33

+0

是的,完成後關閉它。不是在返回之後,因爲沒有評估過return之後(此外,在這個階段你顯然還沒有完成實例,如果你在哪裏,你將不會從方法中返回:)) – JustDanyul 2013-03-14 01:27:38