2

我在以下代码中使用了一个光标。但是我想在使用后关闭光标并且不再需要它。问题是在return语句中使用了游标,但是在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
}
4

5 回答 5

2

您可以将其分配给 String 对象,然后关闭光标并返回它。

cursor.moveToFirst();
String result = cursor.getString(column_index);
cursor.close();
return result;
于 2012-12-12T10:38:44.897 回答
1

使用 finally 块对你有用吗?我对您的特定问题没有经验,但是您能否将清理放在 finally 块中,否则会被 return 语句绕过:

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

只是一个想法!没有就别拍我!

于 2012-12-12T10:39:23.477 回答
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 管理其生命周期。如果您无权访问 Android 应用程序上下文(例如:代码在实用程序类中),请使用上述方法。(并撒上一些错误处理;))

于 2012-12-12T10:42:09.643 回答
0

好吧,如果您每次都为同一个 Activity 创建一个新实例(尽管我不确定它是否是一个好的编程习惯)。您可以在完成遍历/迭代行/列后立即关闭光标。不要忘记使用:

   startManagingCursor(cursor);
于 2012-12-12T10:39:18.530 回答
0

if (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();
        }
    }
于 2012-12-12T10:41:27.733 回答