android数据库操作的基础有三个类:SQLiteOpenHelper,SQLiteDatabase和Cursor。其中,SQLiteOpenHelper会建立一个数据库连接,它虽然可以调用多次getWritableDatabase或getReadableDatabase方法,但在彻底关闭db之前,返回的db对象其实是同一个。

    也就是说,如果实例化两个SQLiteOpenHelper,建立两个数据库连接同时操作数据库,会报出数据库已锁定的异常,操作将无效。

    而对于db对象,如果将其彻底关闭,就不能再用来操作数据库,必须重新获取一次。而获取db的过程是比较费时的。



    关于android的db对象,让我困惑的一点是db对象用完后是否要关闭。网上一般有这样几种意见:

    1 db对象开启后就用不关闭。

    2 保持一个单例的db引用,在程序退出前或不再使用数据库时关闭。

    3 每次使用db都要关闭。

4 使用AtomicInteger 计数器来控制db的开启和关闭。

我感觉上面的方案都有其问题:

    1让人感觉就不对头,而且android会不停的报出由于数据库永不关闭造成溢出的警告。    2单例的db问题是,首先无法区分readable和writable,而且很多时候无法确定app退出或不使用数据库的时间点。

    3每次都关闭db,让人怀疑是否会影响性能。

    4用计数器来维持db的引用,增加了代码复杂性。另外,db本身的close方法只是释放了一个引用,只有当所有的引用都被释放后,db才会真正关闭。因此我怀疑计数器是否和db本身的控制机制重复了。



    我想,在没有明显性能影响的情况下,还是每次都关闭db,也能让android日志输出好看一点。



    但即使这样,还是有一个问题,当用ContentProvider返回一个Cursor时,db是不能关闭的,而调用方只能自己关掉Cursor,无法关闭db。不知道ContentProvider是否有一个机制自动关闭db。



    关于Cursor,Cursor使用完必须关闭,否则很容易内存溢出,android也必会报出异常。为了保证Cursor的关闭,可以将Cursor的生命周期和Activity等组件绑定,或者将close方法放在finally代码块中。



    还有一个问题,是Cursor在ContentProvider中跨进程传递机制。我自定义了一个继承MatrixCursor的类,重写了getInt方法,但在调用方处,getInt方法并没有被覆盖。这说明并不是Cursor对象跨进程边界被传递了,具体机制以后有机会可以研究下。

关于android的SQLiteDatabase和Cursor的一些疑问的更多相关文章

  1. Android中SQLite下 Cursor的使用。

    引自博客大神一篇文   地址:  http://blog.sina.com.cn/s/blog_15e2abdd90102wcdu.html rawQuery()方法用于执行select语句.  /* ...

  2. Android——使用SQLiteDatabase操作SQLite数据库

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  3. Android——采用SQLiteDatabase操作SQLite数据库

    除了能够使用文件或SharedPreferences存储数据.还能够选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  4. Android 开发笔记 “Sqlite Cursor 使用”

    使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...

  5. Android 中关于 【Cursor】 类的介绍

    转自(http://www.cnblogs.com/TerryBlog/archive/2010/07/05/1771459.html) 使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生 ...

  6. 单独谈谈 Android Cursor 的使用细节

    使用过 SQLite 数据库对 Cursor 应该不陌生,这里单独拿出来谈一下,加深对Android SQLite中使用 Cursor 的理解. 在你理解和使用 Android Cursor 的时候你 ...

  7. Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操作数据库

    如果开发者对SQL语法不熟,甚至以前从未使用过任何数据库,Android的SQLiteDatabase提供了insert.update.delete或query语句来操作数据库. 一.insert方法 ...

  8. (转) Android开发性能优化简介

    作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...

  9. Android ORM 框架之 greenDAO 使用心得

    前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM  ...

随机推荐

  1. List.removeAll()方法失效

    List.removeAll()方法失效 前几天遇到List.removeAll()方法失效,测试了半天都没测出来,后面跟老大在那边调试了半天,最后终于找出原因,以后要是谁遇到这个奇葩的问题可以借鉴参 ...

  2. Linux下MySql启动时报错

    /opt/mysql/support-files/mysql.server startmy_print_defaults: [ERROR] Found option without preceding ...

  3. linux环境下jdk 安装以及maven私服搭建

    1:准备资源      linux服务器,jdk和nexus  安装包    2:网络通畅,保持windows端和linux服务器端网络通畅.     3: 安装jdk和配置环境变量      进入到 ...

  4. TortoiseSVN上次文件显示被锁定

    1.可以使用SVN clean up来清除锁定. 2.如果不是本目录锁定,系统提示上一层目录锁定,需要到上一层或者根目录中清除. 3.如果在根目录下都无法clean的话,一般采取的方法是另外找一个目录 ...

  5. C++智能指针初学小结

    本篇随笔仅作为个人学习<C++ Primer>智能指针一节后的部分小结,抄书严重,伴随个人理解.主要介绍shared_ptr.make_shared.weak_ptr的用法和联系. C++ ...

  6. UVA 12169 Disgruntled Judge

    我该怎么说这道题呢...说简单其实也简单,就枚举模拟,开始卡了好久,今天看到这题没a又写了遍,看似会超时的代码交上去a了,果然实践是检验真理的唯一标准... #include <iostream ...

  7. Android中图片的目录

    图片放在hdpi及在mdpi中的效果是不一样的 http://blog.csdn.net/loongggdroid/article/details/9469935

  8. POJ 1379 Run Away

    题意:有n个陷阱,在X,Y范围内要求出一个点使得这个点到陷阱的最小距离最大. 思路:模拟退火,随机撒入40个点,然后模拟退火随机化移动. (这题poj坑爹,加了srand(time(NULL))不能交 ...

  9. 《Programming WPF》翻译 第8章 3.Storyboard

    原文:<Programming WPF>翻译 第8章 3.Storyboard Storyboard是动画的集合.如果你使用了标记,所有的动画必须要被定义在一个Storyboard中.(在 ...

  10. WINDOWS 2012忘记密码之后。。。

    要使用windows server 2012安装DVD,选择光盘引导进入 进入修复系统 选择疑难解答,进入界面 选择命令提示符 切换目录至系统目录 执行move命令 执行 copy命令 重新启动系统, ...