9.3 使用数据库
提到数据存储问题,数据库是不得不提的[1]。数据库是用来存储关系型数据的不二利器。Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用。
9.3.1 Android数据库实现
Android的数据库实现,依托于当下最流行的开源嵌入式数据库SQLite[2]。在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内。
从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用Sqlite的接口来执行SQL语句,并通过JNI向上暴露Java可访问的接口。
而在框架层中,Android提供了相关的Java类库,来实现对数据库的访问,并控制数据和连接。为了兼顾数据读写的效率和空间开销,Android在Java逻辑层通过数据窗口机制来控制对数据库中数据的读取[3]。
当应用查询数据时,Android并不会一次性地从数据库中取出所有的数据,而是构建一个数据窗口来动态映射部分数据行,将这些数据行从数据库中读取出来并缓存在上层对象中。如果应用需要的数据正好在窗口的映射范围内,Java逻辑层会立刻从缓存中读取并返回;而如果没有命中,则通过JNI接口去数据库中实时读取。数据行的位置会根据应用对数据的访问行为不断进行调整,并通过后台线程,事先从数据库中异步地读取并更新缓存,通过这样的策略来达到时间开销和空间开销的平衡(如图9-3所示)。
图 9-3 Android数据库的结构和数据窗口机制的实现
[1]特指关系型数据库。
[2]官方地址:http://www.sqlite.org/。
[3]关于窗口机制的相关内容,可以参见本书第3章对于数据源组件的介绍。