关闭数据库时,Android游标方法会出错

时间:2014-04-29 19:27:50

标签: android android-cursor

在Android中,我将数据库中的一些数据查询到游标中,然后关闭数据库。在使用游标方法之后,它会出错。任何人都可以解释原因吗?

2 个答案:

答案 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方法。