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. BZOJ 2729 高精度+组合数学

    思路: 考虑 把男生排成一排 女生和老师往里插 分成两种情况. 1. 女生中间夹着老师 2. 女生中间没有夹着老师 求一下组合* 阶乘就好了 先放Python代码 简洁易懂 def fact(n): ...

  2. 如何运用docker配合python开发

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  3. Vue-router记录

    一.嵌套路由默认选中第一个子路由 可以给主路由加一个重定向的属性,把路径指向相应的子路由. { path: '/home', name: 'Home', //重定向 redirect: '/home/ ...

  4. java题(转载)

    1.下面中哪两个可以在A的子类中使用:( ) class A { protected int method1 (int a, int b) { return 0; } } A. public int ...

  5. Smallest Common Multiple FreeCodeCamp

    题目:找出能被两个给定参数和它们之间的连续数字整除的最小公倍数.  范围是两个数字构成的数组,两个数字不一定按数字顺序排序. 分析:首先题目的意思求一个连续数列的所有数字的最小公倍数,这连续的数字序列 ...

  6. python编写简单的html登陆页面(1)

    1  html 打开调式效果如下 2  用python后台编写 # coding:utf-8# 从同一个位置导入多个工具,# 这些工具之间可以用逗号隔开,同时导入# render_template渲染 ...

  7. RHEL 7 & CentOS 7禁用IPV6(转载)

    RHEL 7 & CentOS 7下禁用IPV6的方法和之前的版本不太一样了,本文整理了一下处理方法: 首先,我们必须给出最根本的解决方法:修改grub,在引导时就不加载IPV6模块 这样修改 ...

  8. SQL增删改

    USE sqlxx CREATE TABLE ygb( sid INT, sname VARCHAR(20), sgender VARCHAR(2), sbirthday DATE, semail V ...

  9. luogu p3918[国家集训队]特技飞行 贪心

    开始没看出来是贪心,一度以为是动态规划,还是太弱了呀-.. 不难分析出,两个相同的飞行动作之间夹一个相同的动作是多余的,所以就贪心一下,按Ci从大到小排序,依次加到左右两端点,知道加不了为止. 代码: ...

  10. 前端开发—jQuery

    jquery简介 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交互, ...