zoukankan      html  css  js  c++  java
  • Android SQLiteDatabase分析

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

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

    老规矩,首先上图:


    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语句所绑定的參数。

  • 相关阅读:
    我的小问题
    js实现随机的四则运算题目
    VC++ 6.0 无法打开文件
    VC6.0致命错误 RC1015: 无法打开包含文件 'afxres.h'.解决方案
    VS2010 如何添加H文件目录和LIB目录
    学习计划(四月)
    IIS与apache的对比:大杂烩
    ubuntu下有线网卡启动(Atheros AR8161 Gigabit Ethernet)
    putty终端乱码解决办法
    Proxy Switchysharp配置
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7056282.html
Copyright © 2011-2022 走看看