2013-05-20 105 views
4

我知道一个数据库关闭后,光标变为“无效”,这是否也同时关闭了光标?这是否避免了必须做下面显示的内容?明确地关闭SQLite数据库中的游标,需要还是不需要?

例如1

public void String getResultsAndReturnString() { 
     String result = ""; 
     SQLiteDatabase db = dbHelper.getReadableDatabase(); 
     Cursor cursor = qb.query(db, projection, null, null, 
        null, null, null); 
     cursor.close(); <-- explicit cursor close example one 
     db.close(); 
    return result; 
    } 

例如2

public void Cursor getResultsAndReturnCursor(){ 
    SQLiteDatabase db = dbHelper.getReadableDatabase(); 
    Cursor cursor = qb.query(db, projection, null, null, 
        null, null, null); 
    return cursor; 
} 

public void closeOut(Cursor cursor, SQLiteDatabase dataBase){ 
    cursor.close(); <-- explicit cursor close example two 
    dataBase.close(); 
} 

回答

5

光标不会被关闭数据库(它仍然存在,你可以在上面进行操作),在严格意义上封闭的,但如你所知,关闭数据库会使光标变得无用。你应该在完成使用后明确关闭游标,原因如下:

1)正如你所说的,在关闭数据库之后,任何剩余的游标变得“无效”,并且不能依赖准确的数据;

2)您将在LogCat中看到警告; 3)如果你保持对游标的引用,你就会冒内存泄漏的风险;和

4)这是一个很好的编程习惯来关闭你不再需要的资源。

+0

游标如何映射到系统资源?什么是db实例本身呢?我相信db是映射的os资源,但不能确定游标。关闭游标试图关闭底层数据库(可能会或可能不会成功),那么这里的逻辑是什么?有任何想法吗? – zgulser

+0

@zgulser我认为关于“[c]丢失游标尝试关闭底层数据库”的断言是不正确的。游标是数据库的一组离散结果,而不是数据库本身。因此,关闭游标对数据库没有影响。 – MarsAtomic

+0

嗨,这就是我在堆栈跟踪中看到的原因。尽管如此,它并不一定会关闭 - 它只是试图按照我的理解关闭它。此外,总是建议在关闭db之前进行空检查,我怀疑这个断言可能是原因。 – zgulser

相关问题