`
meohao
  • 浏览: 97775 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

写在20110921:Cursor关闭问题

 
阅读更多
   Cursor是查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cusor最终会被释放掉。然而如果Cursor的数据量特表大,特别是如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。并且Android明显是倾向于编程者手动的将Cursor close掉,因为在源代码中我们发现,如果等到垃圾回收器来回收时,会给用户以错误提示。所以我们使用Cursor的方式一般如下:
Cursor cursor = null;
try{
    cursor = mContext.getContentResolver().query(uri,null,null,null,null);
    if(cursor != null){
        cursor.moveToFirst();
        //do something
    }
}catch(Exception e){
    e.printStatckTrace();
}finally{
    if(cursor != null){
        cursor.close();
    }

}
  有一种情况下,我们不能直接将Cursor关闭掉,这就是在CursorAdapter中应用的情况,但是注意,CursorAdapter在Acivity结束时并没有自动的将Cursor关闭掉,因此,你需要在onDestroy函数中,手动关闭。
@Override 
protected void onDestroy() {       
    if (mAdapter != null && mAdapter.getCurosr() != null) { 
        mAdapter.getCursor().close(); 
    } 
    super.onDestroy();  
}
    CursorAdapter中的changeCursor函数,会将原来的Cursor释放掉,并替换为新的Cursor,所以你不用担心原来的Cursor没有被关闭。你可能会想到使用Activity的managedQuery来生成Cursor,这样Cursor就会与Acitivity的生命周期一致了,多么完美的解决方法!然而事实上managedQuery也有很大的局限性。managedQuery生成的Cursor必须确保不会被替换,因为可能很多程序事实上查询条件都是不确定的,因此我们经常会用新查询的Cursor来替换掉原先的Cursor。因此这种方法适用范围也是很小。




分享到:
评论

相关推荐

    Android cursor的用法

    在 Android 开发中,Cursor 是一个非常重要的类,主要用于处理数据查询结果。它提供了一个简洁的方法来访问数据库查询的结果集,并允许开发者方便地遍历这些结果。对于新手而言,理解 Cursor 的工作原理以及如何正确...

    mybatis-cursor:mybatis光标问题(https

    在服务或DAO层,你可以通过`try-with-resources`语句来使用`Cursor`,确保其在使用完毕后被正确关闭: ```java try (Cursor<YourDomainClass> cursor = yourMapper.getAll()) { for (YourDomainClass item : ...

    cursor的部分操作

    - `isClosed()`:判断`Cursor`是否已经被关闭。 示例代码: ```java if (!cur.isClosed() && !cur.isAfterLast()) { while (!cur.isAfterLast()) { int nameColumn = cur.getColumnIndex(People.NAME); String ...

    Android App调试内存泄露之Cursor.zip

    - 总是在完成Cursor操作后调用`close()`:确保在不再需要Cursor时关闭它,释放数据库连接。 - 使用`WeakReference`:创建弱引用的Cursor,这样即使有外部引用,只要没有强引用,Cursor仍然会被垃圾回收。 - 在...

    Cursor的用法.docx

    在Android开发中,`Cursor` 是一...在实际应用中,一定要记得在使用完`Cursor`后及时关闭,避免资源泄漏。同时,为了代码的健壮性,推荐使用列的索引而非列名来获取数据,特别是在处理动态列名或者不确定列名的情况下。

    oracle-cursor.rar_cursor_oracle_oracle cursor

    Oracle游标是数据库管理系统中非常重要的一个概念,它在处理SQL查询时扮演着核心角色,尤其是在需要逐行处理结果集的场景下。Oracle游标允许我们动态地控制和操作查询的结果,使得我们可以按需处理每一行数据,而不...

    Oracle中Cursor介绍[归类].pdf

    当执行这些语句时,系统会自动打开游标,处理数据,然后在事务结束时自动关闭。隐式游标提供了几个关键属性,帮助开发者检查操作的状态: - SQL%ROWCOUNT:返回DML语句影响的行数。 - SQL%FOUND:如果操作成功,...

    cursor游标

    游标(Cursor)是数据库管理系统中的一个重要概念,尤其在Oracle数据库中,它的应用无处不在,为处理复杂的数据操作提供了强大的支持。游标允许我们逐行处理查询结果,而不是一次性加载所有数据,这对于大型数据集的...

    android在异步任务中关闭Cursor的代码方法

    标题所提及的"在异步任务中关闭Cursor的代码方法"主要关注的是如何在异步任务完成或不再需要`Cursor`时正确关闭它。`managedQuery`方法是Android早期提供的一种方式,用于自动管理`Cursor`的生命周期,它会在...

    Java获取Oracle存储过程返回的Cursor

    在Java编程中,有时我们需要调用Oracle数据库的存储过程,特别是当存储过程返回一个游标(Cursor)时,这种情况在处理大量数据或者分页查询时很常见。游标允许我们逐行处理结果集,而无需一次性加载所有数据,这对于...

    Python3实现连接mysql并执行增删改查操作(源代码)

    最后,通过定义一个主函数来演示如何按顺序执行上述CRUD操作,并在操作完成后关闭数据库连接。 ```python def main(): connection = connect_to_mysql() if connection: # 示例操作 insert_data(connection, ...

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    而REF CURSOR则是PL/SQL(Oracle数据库的存储过程语言)中的一个概念,它相当于一个指向结果集的指针,可以在PL/SQL中动态打开和关闭。 在Oracle9i之前的版本,直接从Java存储过程返回ResultSet是不被支持的,因为...

    Oracle数据库中的Cursor介绍

    ### Oracle数据库中的Cursor详解 #### 一、游标的基本概念 **游标(Cursor)**是Oracle数据库中的一个重要特性,主要用于处理SQL查询返回的结果集。它允许应用程序以更灵活的方式逐行处理查询结果,而非一次性处理...

    A0608使用SQLiteCursor1

    2. 错误处理:确保在使用完Cursor后关闭它,避免资源泄露。可以使用try-with-resources语句自动关闭Cursor。 3. 数据安全:在处理用户输入时,谨慎使用selectionArgs,防止SQL注入攻击。 总结,SQLiteCursor是...

    oracle CURSOR例子

    在Oracle数据库管理中,游标(Cursor)是一种强大的工具,用于处理SQL语句返回的结果集中的数据。游标允许程序逐一访问结果集中的每一行记录,并进行复杂的逻辑处理。本文将通过几个示例详细介绍Oracle中游标的使用...

    11-3--游标Cursor1

    游标(Cursor)在数据库系统中的应用 在数据库系统中,游标(Cursor)是一种重要的概念,它允许开发者对数据库中的数据进行遍历和操作。游标可以看作是一种指针,指向当前记录集的某一行,通过游标,可以对记录集...

    use_default_cursor.rar_-use_cursor_DEMO

    在编程领域,数据库操作是常见的任务之一,而游标(Cursor)在数据库操作中扮演着重要角色。游标允许我们按需逐行处理查询结果,而不是一次性获取所有数据。本DEMO "use_default_cursor.rar" 提供了一个关于如何在...

    plsql.zip_PLSQL Developer_cursor

    在PL/SQL(Procedural Language/Structured Query Language)中,游标(Cursor)是数据库编程中的一个重要概念,主要用于处理SQL查询返回的结果集。游标允许我们遍历查询结果,并一次处理一行数据。本篇文章将深入...

Global site tag (gtag.js) - Google Analytics