我在下面的代码中使用了一个游标。但是我希望在使用它之后关闭它,不再需要它。问题是游标在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
}
答案 0 :(得分:2)
您可以将其分配给String对象,然后关闭光标并将其返回。
cursor.moveToFirst();
String result = cursor.getString(column_index);
cursor.close();
return result;
答案 1 :(得分:1)
使用finally块对你有用吗?我对你的特定问题没有经验,但是你可以把你的清理放在finally块中,否则会被return语句绕过:
http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
只是一个想法!如果没有,请不要开枪!
答案 2 :(得分: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应用程序上下文(例如:代码在实用程序类中),请使用上述方法。 (并撒上一些错误处理;))
答案 3 :(得分:0)
好吧,如果你每次都在同一个Activity上创建一个新实例(虽然我不确定它是一个很好的编程习惯)。一旦完成遍历/遍历行/列,就可以关闭光标。别忘了使用:
startManagingCursor(cursor);
答案 4 :(得分: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();
}
}