2012-12-12 70 views
2

我有一個遊標,我在下面的代碼中使用。但是我想在光標被使用並且不再需要之後關閉光標。問題是遊標被用在return語句中,但是在返回語句後我無法關閉它,因爲這是無法訪問的代碼。它在return語句中使用,所以我無法在該行之上關閉它。我如何關閉光標?這不像舊的managedQuery,我認爲你必須關閉它。在哪裏關閉遊標?

public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Audio.Media.DATA }; 
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
     // cursor.close() <--- not possible because it is unreachable code after return 
} 
+0

我忘了在我原來的帖子中添加。這是在一個服務,而不是一個活動,所以我想我不能在一個服務中使用startManagingCursor()。 – Kevik

回答

2

您可以將它分配給一個String對象,然後關閉遊標並返回它。

cursor.moveToFirst(); 
String result = cursor.getString(column_index); 
cursor.close(); 
return result; 
0

那麼,如果你是每次創建一個新的實例相同的活動(雖然我不知道它是一個很好的編程習慣)。只要您完成遍歷/遍歷行/列,就可以關閉遊標。不要忘記使用:

startManagingCursor(cursor); 
0

如果(this.daoDatabase!= NULL){

 final Cursor genericCursor = this.daoDatabase.query(this.tableName, null, null, null, null, null, orderByCriteria); 

     if (genericCursor != null) { 
      if (genericCursor.moveToFirst()) { 
       do { 
        // do stuff... 
       } while (genericCursor.moveToNext()); 
      } 
      genericCursor.close(); 
     } 
    } 
1

嘗試 - 最後的救援......

public String getPath(Uri uri) { 

    Cursor cursor = null; 

    try { 
    String[] projection = { MediaStore.Audio.Media.DATA }; 
    cursor = getContentResolver().query(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
    cursor.moveToFirst(); 


    return cursor.getString(column_index); 
    } 
    finally { 
    if (cursor != null) 
     cursor.close(); // close the cursor 
    } 


} 

注意

剛剛提到下面另一個答案。 。 如果您正在進行一項活動,您可以撥打startManaginCursor()並通過cursor實例,以便Android將m它的一生。如果您無法訪問Android應用程序上下文(例如:代碼位於實用程序類中),請使用上述方法。 (並撒上一些錯誤處理;))

+0

這是一個奇妙的想法,但是對於這個問題,我喜歡更簡單的分配給臨時字符串對象的方式。 – Kevik