在Android中,我将数据库中的一些数据查询到游标中,然后关闭数据库。在使用游标方法之后,它会出错。任何人都可以解释原因吗?
答案 0 :(得分:0)
这是预期的行为。游标需要打开数据库才能读取数据。
答案 1 :(得分:0)
这不是一个直接的答案,但它是如何做你正在谈论的事情的一个例子。我有一个名为ContactDataSource的类,它允许通过Cursor访问和操作我的数据库。为此,需要能够打开和关闭数据库。这是通过以下方法在我班上处理的
public void open() throws SQLException{
db = helper.getWritableDatabase();
}
public void close(){
helper.close();
}
我需要能够获取所有联系人,以便我可以利用他们的变量,修改它们等等。在我一直保持数据库连接打开的情况下效率低,更不用说非常安全了需要有问题的变量。我需要在我的设备上的某个地方存储我的数据库中的信息。为此,我需要调用以下方法
private String[] allColumns = {ContactDataSQLHelper.COLUMN_ID, ContactDataSQLHelper.COLUMN_CONTACT_NAME,
ContactDataSQLHelper.COLUMN_CONTACT_ADDRESS, ContactDataSQLHelper.COLUMN_CONTACT_NUMBER};
...
public ArrayList<ContactObject> getAllContacts(){
ArrayList<ContactObject> contacts = new ArrayList<ContactObject>();
// Again, without our Cursor, we can't actually point at any of the data we want to
// work with/manipulate
Cursor cursor = db.query(ContactDataSQLHelper.TABLE_CONTACTS, allColumns,
null, null, null, null, null);
cursor.moveToFirst();
while(!cursor.isAfterLast()){
ContactObject contact = cursorToContact(cursor);
contacts.add(contact);
cursor.moveToNext();
}
cursor.close();
return contacts;
}
将以ContactObjects的形式返回我的联系人列表。您可以看到此方法一旦完成就会关闭光标的数据库连接。但是,在它关闭之前,它会调用cursorToContact(cursor),这将允许我们使用我们的游标来创建一个可读的ContactObject
private ContactObject cursorToContact(Cursor cursor){
int id = cursor.getInt(0);
String name = cursor.getString(1);
String address = cursor.getString(2);
String number = cursor.getString(3);
return new ContactObject(name, address, number, id);
}
简而言之:Open Connection -> Get what you need from your database -> Store it in an object/variable -> Close connection
是需要采取的过程。
这可以通过call open method -> call getter method -> (if needed) call helper method -> call close method
重要的是要注意,如果要反转过程(保存已修改的数据库信息),则遵循类似的过程,只使用数据库设置器方法而不是getter方法。