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