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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值