Android数据库(SQLite)设计的几个要点

来源:互联网 发布:js date 初始化 编辑:程序博客网 时间:2024/04/30 02:13

一、数据读写效率与分表策略

在设计数据库的时候,需要充分考虑后续读写数据的时间复杂度,特别是在频繁提取数据库数据用于作图等应用中。提高数据库查询效率最直接的办法就是合理设计查询条件,避免查询耗时随着数据量增大线性增加。

在设计数据库时,应该按照软件系统的数据类型对数据进行分类存储管理。以包含用户基本信息和扩展信息为例进行说明,并且假定其扩展信息是需要被频繁访问的数据。采取的方案应该至少包括两个原则:(1)将基本信息与扩展信息分离(换句话说,将系统中的静态数据与动态数据分离),分别进行读写,避免数据冗余,提高数据访问效率;(2)根据用户ID和动态数据产生时间定义扩展数据数据库,减少数据查询条件,降低提取数据的时间,提高响应速度,同时,避免数据操作过程中可能出现的内存泄露。

在涉及需要异步操作数据时,数据库的结构设计尤其重要。常见的数据库设计模式较多,通过分表进行数据库模块化设计是最常用到的。不过在软件设计中,应该尽量减少数据库的异步操作,尽量通过软件中组件之间的通信实现数据沟通。

举例说明如下:

首先,新建保存用户信息的UserInformation.db。然后在此数据库目录中建议表名为UserInformation的列表,保存软件中所有的用户数据信息。这里建议使用设备的唯一ID作为表名,因为这样能够方便的识别多个设备。基于Android的设备不建议采用Android ID,因为此ID号并非始终不会改变,在恢复出厂设置之后,Android ID就会发生变化。因此,不能作为唯一识别码。

然后,根据用户ID(每个用户在系统数据库中对应一个ID)建立相应的保存测量结果的数据库文件。比如,UserInformation.db中某位用户的ID为8,则依次建立8.db。然后在此数据库文件中以用户名+日期(年、月)为表名,建立数据表,保存某个用户某月的数据。比如表名为:u1201403(由于数据表命名规则,表名首位不能为数字,因此取user的首字母;1表示用户的ID;201403表示2014年3月的测量结果)。大致结构如图1所示。

1 数据库结构

这里主要涉及的问题有:数据库以及数据表的创建时机,数据的写入及更新。软件中需要对数据库进行操作的主要有如图2的步骤:


图2 数据操作流程

二、数据库数据使用及数据结构分析

将数据库建立,并且将数据插入到数据库中,实际才完成了一小部分。重点是数据库中的数据如何在后续过程中使用以及使用过程中的问题。这里主要分析Cursor以及数据结构。

Java中对内存对象的访问,使用的是引用的方式。在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在Java程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。查询数据库是通过cursor,程序中可能涉及到很多数据种类,因此,需要对数据库进行各种不同条件的查询,产生了大量的Cursor,常见的操作是将Cursor转换为List<String>,然后将cursor关闭。这里可能涉及到Java内存泄露的问题,具体情况不在此分析(可以参考http://www.cnblogs.com/qianxudetianxia/archive/2012/11/19/2757376.html)。

在设计时,需要考虑采用合适的数据结构,最常用到的数据结构主要有数组和列表。对于固定长度的数值序列,采用数组来表示,例如,保存坐标标签的字符串数组,保存查询数据库条件的日期字符串数组。这里主要对数据列表进行说明。用户的动态数据是不确定的,次数任意。因此,不能采用固定长度的数组来保存测量数据,这样既可能造成数据溢出,也可能造成数据区间浪费,程序的空间复杂度增加。因此,采用List来存储测量值。可能会用到List<List<String>>、List<String>、List<double[]>。采用List<List<String>>的原因主要考虑到程序的可扩展性及可维护性。

另外,采用列表时需要考虑数据的使用条件和表结构的存储方式。顺序存储结构的列表在存储单元中开辟连续的空间,供数据依次存储,因此,适合随机访问较多的列表,比如数据在表尾依次写入(时间复杂度为O(1)),其余操作均为随机访问(根据地址直接读取,时间复杂度为O(1))。链式存储结构的列表在存储单元中以节点为单位,每个节点包括数据信息及后继数据地址链接,因此,适合插入、删除较多的列表,比如需要在不同存储位置插入、删除数据,其操作时间复杂度为O(1),但其随机访问的时间复杂度随着数据在列表中的位置靠后而线性增加。

因此,在提取数据用于后续使用时,数据转换过程中一定要按照实际使用环境合理采用不同的数据结构。并且,通过数据流分析技术,将整个数据流程理清,减少中间变量。

 

0 0
原创粉丝点击