当我在 cursor 对象上调用 close()方法时,我的问题是理解为什么我的ListActivity及其对应的 listView 为空? / p>
让我解释一下......
我从数据库中检索了一些值,并在我的游标对象中获取结果。之后,我创建了 SimpleCursorAdapter 并使用我的 listView 中的字段从db绑定列。
像魅力一样,但是......
如果我在 onCreate()方法的末尾调用 cursor.close(),我的listView会显示为空?
如果我将值从光标记录到LogCat,它们就在那里,直到调用 cursor.close()并且这很有意义,但为什么在 cursor.close时listAdapter被清空( )被称为??? 我希望 ListAdapter listAdapter = new SimpleCursorAdapter(...)将“绑定”的值保存到 listView ,直到我们的活动被销毁...
为什么会这样?什么时候需要关闭光标?
public class ListTrainingsView extends ListActivity{
private SQLiteDatabase db;
private ListAdapter listAdapter;
private Cursor cursor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_trainings);
DatabaseHelper helper = new DatabaseHelper(this);
this.db = helper.getWritableDatabase();
this.cursor = db.query("trainings", fields, null, null, null, null, null);
startManagingCursor(cursor);
this.listAdapter = new SimpleCursorAdapter(this,
R.layout.list_trainings_item,
cursor,
new String[] {"name"},
new int[] { R.id.name_entry}
);
this.setListAdapter(this.listAdapter);
//If I call
//cursor.close();
//shown list is empty
另一个问题是更多基本的Java语言类型问题...我来自PHP OO背景,如果你定义成员变量,你必须使用语法 $ this-> cursor在对象方法中使用它。我注意到在Android / Java中我不必使用 this.cursor.getCount()来从中获取引用/值。这就足以说 cursor.getCount()为什么允许这样做?
答案 0 :(得分:2)
你不应该关闭你的游标unil你的Activity被销毁(即在onDestroy()
中),因为CursorAdapter的实现期望它被打开以便能够重新查询和过滤它。
由于您无论如何都在调用startManagingCursor
,因此您的Activity将自动停用,重新查询并关闭相应的Activity生命周期事件,因此无需自行关闭它。
答案 1 :(得分:1)
为什么会这样?
Adapter
需要提供Cursor
的数据并相应地准备ListView
,当您致电cursor.close()
时,Cursor
将被释放并失效。 (表示没有数据。)
什么时候需要关闭光标?
当您即将离开Cursor
并从Activity
返回时,有必要关闭Activity
,否则Cursor
已被泄露Activity
}。
这就足以说了cursor.getCount()为什么允许这样做?
Java的结构基于类。每个动作都在特定的课程中完成。即使回应“单行”也需要一个班级。当您在课堂上时,您可以使用this
或访问具有直接变量的班级成员