Android中的数据存储使用的小巧的SQLite数据库。

为了方便java层使用SQLite,android做了大量的封装。提供了一些列的类和API。本文章就揭露这些封装背后的类图关系。

老规矩,首先上图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2FpbGluZ3RoaW5r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

SQLiteOpenHelper是Android SDK所提供的一个帮助类,通过此类来管理数据库的创建和版本号控制。

通过SQLiteOpenHelper函数getReadableDatabase和函数getWritableDatabase能够得到一个SQLiteDatabase对象。用户通过继承SQLiteOpenHelper类,实现其抽象函数,以实现数据库表格的创建,版本号的升级等功能。

从UML途中能够看到SQLiteDatabase中有一个成员变量指向DatabaseErrorHandler接口。这个对象用来处理数据库发生异常的case。我们能够实现这个接口来处理数据的异常case,比方数据库损坏打不开,就会调用到这个接口的onCorruption函数。

SQLiteDatabase提供了对数据库的一些操作函数。比方query。insert,delete等。这里仅仅说一种case:query。途中绿色的线条代表着query的调用流程走向。

通过SQLiteDatabse的query函数,能够得到一个SQLiteCursor对象。它实现了Cursor接口。

SQLiteCursor代表着查询数据库后的结果集。假设是本进程内调用SQLiteDatabse,那么得到Cursor接口实际上是SQLiteCursor对象,假设是跨进程,比方通过ContentProvider的query接口查询一个Uri得带一个Curosr接口,那么实际的对象将是一个支持跨进程通信的Cursor对象。这里就不做具体的描写叙述了,在以后的文章中再单独解说Cursor的结构体系。

SQLiteDatabse的一个特色是对多线程的訪问做了封装。

每一个线程都有保存着一个session,用来和数据库通信。而实际的通信过程是seesion从connect pool中得到一个SQLiteConnection连接,通过这个连接来操作native层真正的数据库。每次操作数据库的时候都必须得到一个连接。

SQLiteConnectionPool控制了连接的类型。对于WAL模式的数据库,仅仅能有一个可写的连接,能够有多个读的连接。这样读和写就能够同一时候进行了。当一个可写的连接已经被占用了。假设此时有线程申请写的连接,那么这个线程会进入等待队列,直到有可利用的写连接为止。对于journal mode的数据库,4.2的代码是仅仅同意有一个连接。

SQLiteProgram代表着一次对数据库操作的各种资源。它里面保存着SQL语句。所操作的数据库对象,以及SQL语句所绑定的參数。

Android SQLiteDatabase分析的更多相关文章

  1. Android多线程分析之五:使用AsyncTask异步下载图像

    Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<An ...

  2. Android多线程分析之四:MessageQueue的实现

    Android多线程分析之四:MessageQueue的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前面两篇文章<Androi ...

  3. Android多线程分析之三:Handler,Looper的实现

    Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多 ...

  4. Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处   在前文<Android多线程分析之一 ...

  5. Android多线程分析之一:使用Thread异步下载图像

    Android多线程分析之一:使用Thread异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处   打算整理一下对 Android F ...

  6. Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换

    已经很久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能.目前很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...

  7. Android Launcher分析和修改9——Launcher启动APP流程

    本来想分析AppsCustomizePagedView类,不过今天突然接到一个临时任务.客户反馈说机器界面的图标很难点击启动程序,经常点击了没有反应,Boss说要优先解决这问题.没办法,只能看看是怎么 ...

  8. 正确使用Android性能分析工具——TraceView

    http://blog.jobbole.com/78995/     首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - Ja ...

  9. Android架构分析之Android消息处理机制(二)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...

随机推荐

  1. [转载]H3C&nbsp;S3600&nbsp;DHCP-SERVER&nbsp;配置【原创】

    原文地址:H3C S3600 DHCP-SERVER 配置[原创]作者:旅行者萧 案例要求: 在H3C S3600-28TP-SI 的vlan 里配置DHCP server,使用vlan 里部分网段为 ...

  2. [jqpolt] formatString 日期格式化列表

    // 年 %Y   2008 %y   08 // 月 %m   09 %#m   9 %B   September %b   Sep // 日 %d   05 %#d   5 %e   5 %A   ...

  3. 第一天:java与mysql的连接工具类

    第一天:java与mysql的连接工具类 java最新版马上就要收费,这无疑是这门语言的衰败起始,毕竟在中国收费便难发展,例如c#,但是毕业设计已经选好用java来写一个动态网站, 这已经是一个事实, ...

  4. 11.javaweb国际化标签库

    一.国际化标签库 1,格式化标签库提供的标签 2,标签详解 2.1<fmt:setLocale>标签 下面设置不同的区域,并在设置的区域下显示日期 2.2<fmt:requestEn ...

  5. ObjecT4:On-line multiple instance learning (MIL)学习

    原文链接:http://blog.csdn.net/ikerpeng/article/details/19235391 用到论文,直接看翻译. 文章:Robust object tracking wi ...

  6. 杭电 1040 As Easy As A+B 【排序】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1040 解题思路:数据不大,可以直接用冒泡排序 #include<stdio.h> int ...

  7. JeeSite 4.0 规划(二)

    ==== 点击放大查看 ==== ==== 点击放大查看 ====

  8. 简明git教程(单人版本)

    最近开始写一个比较大的东西,所以需要用到git,之前一直在用金山快盘和乌龟搭建的SVN,最近想尝试一下git 1.安装 Ubuntu: sudo apt-get install git 老版本的Ubu ...

  9. scrapy 动态网页处理——爬取鼠绘海贼王最新漫画

    简介 scrapy是基于python的爬虫框架,易于学习与使用.本篇文章主要介绍如何使用scrapy爬取鼠绘漫画网海贼王最新一集的漫画. 源码参见:https://github.com/liudaol ...

  10. css3媒介查询使用规则小结

    响应式布局可以为不同终端的用户提供更加舒适的界面和更好的用户体验,而且随着目前大屏幕移动设备的普及,用大势所趋来形容也不为过. 用一句话来说:使用同一套Html代码来适配不同设备和满足不同场景不同用户 ...