移动图书馆的数据存储系统研究

2016-05-16 02:54封俊
太原学院学报(自然科学版) 2016年4期
关键词:存储器数据量应用程序

封俊

(太原学院,山西 太原 030032)

近年来,随着无线通信网络和智能移动终端的发展,使得基于移动终端的图书馆应用成为可能。各大高校作为学生比较集中的区域,使用基于Android 系统智能手机上网的用户群体是非常庞大的,甚至一些高校Android 智能手机的普及率已经远远超过了计算机。因此,如何有效利用这一信息技术平台,使广大学生能够方便、快捷地使用图书馆资源,成为未来高校图书馆发展的一个重要研究课题。

移动图书馆应用程序包含哪几种数据类型,以及如何高效地存储这些数据,一直是此类应用程序的核心问题。本文主要研究目前Android 系统下常用的四种数据存储方式——SharedPreferences 存储、文件存储、关系型数据库和面向文档数据库,以及其各自的实现原理,通过一系列批量存储和随机查询实验,检验各种存储方式的存取效率,分析这四种数据存储方式的优缺点,阐述每种数据存储方式在移动图书馆应用程序中的适用范围。

1 Android数据存储方式

1.1 SharedPreferences存储

SharedPreferences 是Android 平台上一种轻量级的存储方式,其本质是将Key-Value 这种键值对形式的数据以XML 文件格式存储[1],并提供非常简便的方法来读写这些数据。SharedPreferences 存储方式只能存储基础类型数据,包括布尔型、浮点型、整型、长整型、字符串型以及字符串的集合,对于更复杂的数据结构就无能为力了。

使用SharedPreferences 存储存储数据需顺序执行以下4个步骤:

1)获取应用上下文环境对象。

Context context = getActivity();

2)通过上下文环境对象来创建或者获取SharedPreferences 对象的实例。

SharedPreferences sharedPref=context.getSharedPrefer_ences(“mobile_lib”, Context.MODE_PRIVATE);

3)首次使用SharedPreferences 对象时系统会在应用程序目录中建立 “shared_prefs” 的目录,其绝对路径为 “/data/data/应用程序包名/shared_prefs/”,通过SharedPreferences 对象就可以实现读取数据了。

//读取借阅证编号

int readerID = sharedPref.getInt(“ReaderID”, 0);

4)如果需要实现写入操作,还需要创建编辑器对象Editor。在编辑器Editor 中插入数据,确认提交后写入手机存储器。

//写入借阅证编号

SharedPreferences.Editor editor=sharedPref.edit();

editor.putInt(“ReaderID”, readerID);

editor.commit();

1.2 文件存储

Android 底层文件存储基于Linux 文件系统,并使用了Java 的标准输入输出接口来读写数据文件[2]。几乎所有的Android 移动设备的文件系统都包含了两个数据存储区——内部存储器和外部存储器。由于内部存储器容量有限但读写速度较快,主要用于存储系统文件、应用程序安装文件及其核心数据等;而外部存储器一般是可扩展存储器,容量较大但读写速度相对较慢,适合于存储大型数据文件和应用程序之间共享的数据文件等。因此使用文件存储数据前,我们应该首先对数据进行分析,确认数据是否必须存储于内部存储器,否则尽量使用外部存储器。

我们使用文件存储前必须根据数据类型判定使用内部存储还是外部存储。如需使用内部存储,通过应用上下文环境对象获取内部存储目录,并创建File 对象。

File file=new File(context.getFilesDir(), filename);

如需使用外部存储,首先必须在应用程序的清单文件中添加读写外部存储权限,然后再通过应用上下文环境对象获取外部存储目录,并创建File 对象。

File file=new File(Environment.getExternalFiles_Dir(), filename);

此时,分别在内外存中,创建了名为filename的文件。

保存数据时以文件名作为参数,通过openFile_Output 方法打开一个输出流对象,此时可以使用Java 标准输出方法将数据以字节方式写入指定存储器。

FileOutputStream outputStream=openFileOutput(filename, Context.MODE_PRIVATE);

outputStream.write(bytes);

读取数据时同样以文件名作为参数,通过openFileInput 方法打开一个输入流对象,此时可以使用Java 标准输入方法将数据以字节方式从指定存储器中读出。

FileInputStream inputStream=openFileInput(filename);inputStream.read(bytes);

1.3 关系型数据库

Android 系统从最初版本开始,就集成了一个关系型数据库SQLite。SQLite 是一个功能强大的轻量级嵌入式关系型数据库引擎[3],其设计目标是为嵌入式设备提供简单高效的结构化存储工具。SQLite 支持标准的SQL 语法,遵循了数据库的ACID 事务,提供插入、删除、修改操作,支持Null、字符串、数字和二进制等常用数据类型。它占用资源非常的低,运行效率较高,特别适合于移动操作系统。

使用关系型数据库的第一步是创建SQLiteOpenHelper子类 。Android系统将与应用程序相关的数据库存储在一个私有存储区中,这个存储区其他应用程序无法访问,以此来保证数据的安全。在使用这个存储区时,先要获取数据库的引用,也就意味着需要创建专属于此应用的SQLiteOpenHelper 子类,子类必须重写onCreate、onUpgrade 和onOpen 方法。此后,通过这个子类的实例对象可以对数据库进行管理,包括数据库的创建、版本管理和更新表结构等操作。

第二步,获取数据库的引用。SQLiteOpenHel_per 的子类提供两个方法getReadableDatabase ()和getWriteableDatabase(),分别以只读和读写的方式获取SQLiteDatabase 实例对象。只有获取了数据库引用,也就是SQLiteDatabase 实例对象后,才可以使用SQL 语言对数据库进行操作。

第三步,对记录进行操作。SQLiteDatabase 类由Android 系统提供,它封装了几乎所有常用的记录操作方法,例如insert、delete、query、update 等方法,用于实现对数据库的增、删、查、改等操作。此外,当以上方法还无法满足我们的特定操作时,还有一种高度灵活的数据库执行方法execSQL,用以执行复杂的SQL 语句。

1.4 面向文档数据库

在实际应用中,经常会遇到需要存储的数据格式未知,类型不确定的情况,此时使用面向文档数据库是最适合的。面向文档数据库是一种将数据用文档结构进行存储的数据库,属于NoSQL数据库的一种[4]。传统的关系型数据库是以“行” 为单位对数据进行存储,而面向文档数据库是以一系列语义上自嵌套的 “文档” 为单位进行存储的。

文档是面向文档数据库中数据的基本单元,文档是模式自由的 (schema free),它将多个键及其关联的值以有序对的形式组织在一起,因此并不要求文档具有某些特定的结构。面向文档数据库不同于传统的关系型数据库,在其存储数据之前,无需预先定义表结构,只需将数据规范化为JSON 格式(一种语义上自嵌套的格式),并对每一个文档赋以唯一的键值“_id”,之后就可以使用面向文档数据库进行存储了。

JSON 格式是文档中数据的基本构成格式,它是JavaScript Object Notation 的简称。JSON 采用完全独立于语言的文本格式将数据表示为 “名称:值”对的组合。JSON 值可以是数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或false)、数组(在方括号中)、对象(在花括号中)、null。其中,对象是一种比较特殊的格式,它是JSON 格式的再嵌套。通过以上值类型的组合可以表示各种复杂的数据结构。

在移动图书馆应用程序中,使用面向文档数据库,首先需要分析每一条数据的结构和类型,将其分解再重新组织成嵌套的JSON 格式,生成一个文档。例如对于一本图书的基本信息可以使用JSON 格式表示为以下形式:

{ “SSN” :209342228, “TITLE” : “Android programming” , “AUTHOR” :{“FIRST NAME” :“Phillips” , “LAST NAME” : “Bill” }, “PRICE” :99.00, “ISBN” : “9787115346438” , …… }

接着,创建一个具有唯一键值的空文档对象,将JSON 格式的数据作为值传递给文档对象。最后,保存到面向文档数据库中。此后,对这条数据的查询、修改和删除都是通过它的键值进行的。

2 四种数据存储方式对比测试

为了尽可能全面对比评估这四种存储方式的差异,我们从性能和资源占用率两方面分别对四者在不同数据量情况下做了测试。由于智能手机存储器容量的限制,一般手机程序的数据量都不会太大。因此,测试中单条数据为30字节,数据量分别为10000,20000,…… ,50000条,统一在Android 模拟器下运行。测试运行多次,记录每次存储所需时间(单位为毫秒),最后汇总取平均值。性能测试结果如表1所示。

表1 存储性能测试

从表1 可以看出,作为Android 系统提供的轻量级存储方式,SharedPreferences 具有最好的性能,新型的面向文档数据库具有与SharedPreferences 相近的性能,两者在存储时间与数据量之间保持线性递增关系,文件存储性能比这两者稍低。关系型数据库的性能表现最差,与其它三种存储方式相比,其插入数据所需的时间随着数据量的增加而明显增加。

另一方面,在测试中记录四种存储方式存储过程中产生的数据文件大小(单位为KB),结果如表2 所示。

表2 资源占用情况

从表2 可以看出,与性能测试结果相反,SharedPreferences 最占资源,其余三种存储方式随着数据量的增长,资源占用情况相差不大。

最后,分别对已存储50000 条数据的三种存储方式做随机查询测试,记录查询所耗费的时间(单位为毫秒),依然测试多次,取平均值。结果为,SharedPreferences:2ms、关系型数据库:3ms、面向文档数据库:8ms。文件存储查询时间与算法息息相关,因此不适合做随机查询。

3 各种存储方式的优缺点及其适用范围

经过以上的分析和测试可知,这四种存储方式各有其优缺点,在程序开发中要结合应用的实际情况进行选择。

SharedPreferences 简单快捷,但是不适合存储大量数据,并且无法进行条件查询,因此在移动图书馆应用程序中,可以用来存储读者登录信息、程序配置参数和界面状态等简单类型数据。文件存储适用于保存少量但文件体积较大的数据,因此适合用以保存图片、图书内容(如pdf、doc 文件)、视频等类型数据。关系型数据库属于Android 系统下的大数据存储方式,支持多种数据类型,有较好的查询性能,最重要的是支持条件查询,可以使用结构化查询语言灵活的从大量数据中查询到所需的记录。但是,关系型数据库缺点同样明显,数据库使用前必须预先定义表结构模式,字段类型不能根据开发的需要随时改变,并且插入大量数据时性能较差。因此,关系型数据库适用于保存那些结构相对固定,查询频率较高和数据量较大的数据。面向文档数据库是一种新型的NoSQL 数据库,具有较高的性能,模式自由的特点,使其可以灵活自由的存储各种类型数据,但是随机查询耗时稍长,因此适合于保存那些结构不确定,并且频繁插入但较少查询的数据。

4 结束语

本文对Android 平台下的SharedPreferences、文件存储、关系型数据库和面向文档数据库四种存储方式进行了分析研究。在阐述其实现原理的同时,结合移动图书馆应用场景,实现了一个综合运用以上四种存储方式的存储系统,分别对其存储性能、查询性能和资源占用三个方面进行了测试,通过分析实验数据,对各种存储方式优缺点进行总结,给出了这四种存储方式的适用范围,简化了应用程序开发过程。

猜你喜欢
存储器数据量应用程序
静态随机存储器在轨自检算法
基于大数据量的初至层析成像算法优化
高刷新率不容易显示器需求与接口标准带宽
宽带信号采集与大数据量传输系统设计与研究
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
任意2~k点存储器结构傅里叶处理器
存储器——安格尔(墨西哥)▲
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序