2012-12-12 71 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