关于android的SQLiteDatabase和Cursor的一些疑问
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的一些疑问的更多相关文章
- Android中SQLite下 Cursor的使用。
引自博客大神一篇文 地址: http://blog.sina.com.cn/s/blog_15e2abdd90102wcdu.html rawQuery()方法用于执行select语句. /* ...
- Android——使用SQLiteDatabase操作SQLite数据库
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...
- Android——采用SQLiteDatabase操作SQLite数据库
除了能够使用文件或SharedPreferences存储数据.还能够选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...
- Android 开发笔记 “Sqlite Cursor 使用”
使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...
- Android 中关于 【Cursor】 类的介绍
转自(http://www.cnblogs.com/TerryBlog/archive/2010/07/05/1771459.html) 使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生 ...
- 单独谈谈 Android Cursor 的使用细节
使用过 SQLite 数据库对 Cursor 应该不陌生,这里单独拿出来谈一下,加深对Android SQLite中使用 Cursor 的理解. 在你理解和使用 Android Cursor 的时候你 ...
- Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操作数据库
如果开发者对SQL语法不熟,甚至以前从未使用过任何数据库,Android的SQLiteDatabase提供了insert.update.delete或query语句来操作数据库. 一.insert方法 ...
- (转) Android开发性能优化简介
作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...
- Android ORM 框架之 greenDAO 使用心得
前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM ...
随机推荐
- SQLServer 2008 R2 发布订阅配置指南
原以为配置SQLServer 2008 R2的发布订阅很简单,实际配置后才发现过程中有问题地方一直都没搞明白,最后经过几天的查找问题和实践,终于搞定了.现将过程记录如下. SQLServer 2008 ...
- Jquery常用方法(转)
原文:http://www.cnblogs.com/Chenfengtao/archive/2012/01/12/2320490.html jQuery是目前使用最广泛的javascript函数库.据 ...
- 在html页头设置不缓存
方法一:在<head>标签里增加如下meta标签. <meta http-equiv="Content-Type" content="text/html ...
- 分布式Session共享(一):tomcat+redis实现session共享
一.前言 本文主要测试redis实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port Tomcat ...
- Java消息服务
什么是消息? 消息是可编程实现两端通信的机制.通常的一些消息技术如:TCP/IP Sockets.管道.文件.共享存储. Java消息服务 Java消息服务,即Java Message Service ...
- ajax请求参数为中文乱码的情况
解决中文乱码问题的方法有很多. 一.前提是ajax请求传递参数对象到后台,对象中的某个参数的值为中文,到后台之后出现乱码,导致报错.问题解决如下: rest层: 二.在tomcat的server.xm ...
- jquery mobile转场时加载js失效
jquery mobile拦截了所有的http请求,并使用ajax请求取代传统的http.请求发出后,框架会将请求的内容插入到页面中data- role="page"的部分,取代原 ...
- 外部主机连接mysql服务器延时严重问题
1.原因:由于mysql对连接的客户端进行DNS反向解析 2.禁用dns解析,在 /etc/my.cnf 中加入skip-name-resolve 3.反向解析说明: 所谓反向解析是这样的:mysql ...
- [C入门 - 游戏编程系列] 序言篇
记得学习C语言的时候,看着别人能写各种各样的小游戏和小软件,甚是羡慕.而自己,虽然说语法都会,但是真正上手写个几百行的代码,就显得力不从心.曾经一度很是郁闷,看过一些书,大都处于教语法的层面,有些涉及 ...
- CC2530定时器3的输入捕获中断
CC2530定时器3的输入捕获中断 使用的是tim3的通道1的输入捕获P1_7口.//GPIO配置成复用功能,同时设置P1_7为输入.void irCaptureGpioInit(void){ P1S ...