现在的位置: 首页 > 综合 > 正文

Android SQLiteDatabase分析

2018年02月10日 ⁄ 综合 ⁄ 共 1166字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.