您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页基于Android系统的数据存储访问机制研究

基于Android系统的数据存储访问机制研究

来源:二三娱乐
第23卷第6期 计算机技术与发展 COMPUTER TECHNOLOGY AND DEVELOPMENT Vo1.23 No.6 2013年6月 June 2013 基于Android系统的数据存储访问机制研究 倪红军 (南京师范大学泰州学院信息工程学院,江苏泰州225300) 摘要:数据存储是开发应用程序时需要解决的最基本的问题,数据必须以某种方式保存,并且能够有效、方便的使用和 更新处理。Android系统是基于Google推出的能在智能终端设备上运行的操作系统,随着应用范围和开发需求的增大,对 软件的开发效率、性能及数据的存储访问机制受到普遍关注。文中从SharedPreferenees、文件、SQLte、ContentProvider、网络 五个方面深入阐述了Android系统的数据存储访问机制原理,并结合它们的内在原理,给出了具体实现方法。最后根据它 们各自的优缺点,分析了各类存储访问机制的适用范围。 关键词:应用开发;数据存储;访问;实现方法;适用范围 中图分类号:TN929.53 文献标识码:A 文章编号:1673—629X(2013)06—0090—04 doi:10.3969/i.issn.1673—629X.2013.06.023 Study of Data Storage Access Mechanism Based on Android System NI Hong-jan (College of Information Engineering,Talzhou College of Nanjing Normal University,Talzhou 225300,China) Abstract:The data storage is the most basic issues that need tO be addressed when developing app ̄cations.the data must be saved in some way,and to be effective,easy to use and update processing.The Android system is introduced based on Google in he itntelligent ter- minal equipment operation of he toperating system,along wih tthe increase of application and development demand,the software develop- merit eficifency performance and data storage access mechanism has been paid more attention.From the SharedPreferences,files,SQLite, ContentProvider,network five aspects discussed deeply the data memory access mechanism principle of Android system,and combined wih ttheir intrinsic principle,the particular method of implementation Was introduced.Finally based on heitr respective advantages and dis- advantages,analyze the applicable scope of the various memory access mechanism. Key words:application development;data storage;access;realization method;application scope 0 引 言 随着Android系统的智能终端市场占有率逐渐走 高,用户对该类设备的应用软件需求也逐渐增多。同 时软件的功能也越来越多,数据存储量也逐渐增大,对 数据的存储访问更加频繁。而Android系统自有一套 存储访问机制,开发者对该机制的深入理解和合理使 用会直接影响软件的开发效率和性能。因此对An- droid系统的数据存储访问机制研究有很重要的意义。 结构包含操作系统、中间件及一些关键的平台应用程 序…。它采用软件堆层(Software Stack)的架构,主要 分为四个部分:①应用层;②应用框架层;③系统运行 库层;( ̄Linux内核层 , 。 2 Android存储访问机制 在进行各类应用开发时,涉及的数据存储访问方 式有三类:文件、数据库和网络。其中文件和数据库存 储方式多用于离线应用开发中,文件使用较方便,不需 要数据库管理系统的支持就可以进行存储访问;而数 据库用起来较为复杂,但它有其强大的优点,比如在海 量数据时性能优越、能方便进行数据的增删改查、可以 1 Android简介 Android是Google开发的基于Linux开放性内核 的开源手机操作系统,目前已广泛应用于手机或平板 电脑等智能终端。Android系统从软件层次上来说,其 收稿Et期:2012—09—10 修回13期:2012-12-16 跨平台等等;网络存储方式则用于比较重要的项目事 网络出版时间:2013—03—05 基金项目:江苏省泰州市2011年计划性课题(201153);Google中国大学合作部2012年Android创新(开发)重点资助项目(SOW12—11/ 64005799) 作者简介:倪红军(1975一),男,江苏靖江人,硕士,讲师,研究方向为管理信息系统、Android应用开发。 网络出版地址:http://www.cnki.net/kcms/detail/61.1450.TP.20130305.0816.020.html 第6期 倪红军:基于Android系统的数据存储访问机制研究 ・91・ 务,比如在线售票、天气预报等实时数据需要通过网络 传输到数据处理中心进行存储、处理。 源文件的语法、格式、保存位置取决于资源类型,在进 行开发时,需要在res/目录下的适当子目录下创建和 Android应用开发也会涉及数据存储访问,结合 Android系统的特点其存储方式总体也分为上面三类, 但从开发者角度来讲,它包含五种存储访问机制。 2.1 SharedPreferences存储访问机制 2.1.1原理 存储资源文件。如res/layout、res/drawable、res/raw等 目录。可以通过R.resource—type.resource—nanle语句 来直接引用这些资源。 2.2.2实现方法 SharedPreferences是一种用来存储简单配置信息 的机制,也是Android平台上一个轻量级的存储类。 (1)流文件的读写。 可以使用FileOutputStream类中openFileOutput() 方法把数据输出到文件中,该文件默认保存在/dat/ a只能存储Long、Float、Integer、Stirng和Boolean五种基 dat/a<包名>/files目录下,也可以通过修改SDCard的 本类型。它是通过“key—value对”的机制将数据存储 访问权限将该文件存放在SDCard卡上。使用FileIn— 在XML文件中,存储位置默认在/data/data/<包名>/ putStream类中openFileInput()方法从文件中读出数 shared_prefs目录下。 据。此方法与J2sE环境基本相同,这里不再赘述。 2.1.2 实现方法 (2)XML文件的读写。 (1)SharedPreferences存储数据方法。 XML即可扩展标记语言,可以用来标记数据、定 SharedPreferences对象本身只能获取数据而不支 义数据类型,允许用户对自己的标记语言进行定义的 持存储和修改,存储修改是通过Editor对象实现的。 源语言。由于XML文件易于与Windows、Mac OS、 代码如下: Linux等平台下产生的信息结合,现在已经成为数据交 Context context=this.gctApplicationContext(); 换的公共语言。所以在进行Andriod应用开发时也可 SharedPreferences sharedPreferences=context.getSharedPref- 以采用XML文件存储数据;可以使用Simple API for erences(”nnutcinfo”,Context.MODE—PRIVATE);//根据Context XML(SAX)、Document Object Model(DOM)及自带的 获取SharedPreferences对象 Editor editor=sharedPreferences.edit();//获取Editor对象 pull解析器解析XML文件。 editor.putString(”schoolName”,”泰州学院”);//学校名称; SAXL4 是一个解析速度快并且占用内存少的解析 通过Editor对象存储key—value键值对数据。 器,非常适合Android等移动设备。它采用事件驱动, editor.putlnt(”schoolCount”,635);//职工人数 不需要解析完整个文档,在按内容顺序解析文档的过 editor.commit();//提交数据 程中,SAX会判断当前读到的字符是否符合XML语法 执行上述代码后,生成的nnutcinfo.xml文件,内容 中的某部分,如果符合就会触发事件。这类事件定义 如下: 在ContentHandler接口 ,包括startDocument()、end— <?xml version=1.0 encoding= 8 standalone="yes ?> Document()、startElement()、endElement()、characters <map> ()等。SAX解析代码如下: <string name=”schoolName”>泰州学院</string> public List<Person>getPemon(InputStream instream)throws <int name=”schoolCount”value=”635”/> Throwable{ /<map> SAXParserFactory factory SAXParserFactory.newlnstance (2)SharedPreferences读取数据方法。 (); SharedPreferences对象读取数据比较简单,使用对 SAXParser parser:factoyr.newSAXParser();//创建一个 象.get (”键名”,”缺省值”)格式就可方便地读出 SAX解析器 数据,其中第二个参数为缺省值,如果SharedPreferenc. PersonPaser personpaser=new PersonPaser(); es中不存在该键名(key),将返回缺省值。代码如下: parser.parse(instream,pesronpaser); String schoolName=sharedPreferences.getString r”school- return PersonPaser.getPersons(); Name”,””); } int schoolCount=sharedPreferences.getlnt(”schoolCount”, 通过SAX解析器对XML文件进行解析,使用 1); parse(InputStream,DefauhHandler)方法;第一个参数表 2.2文件数据存储访问机制 示输入流传人的XML文件,第二个参数表示根据读人 2.2.1 原 理 的XML文件的标记来调用DefauhHandler类中的方 Android系统采用java.io.¥库所提供的I/O接口 法,该类中的这些方法都需要进行重写,上面代码中的 来实现文件读写。同时引入了资源文件,用于存储应 PersonPaser是一个内部类,在该类中根据XML语法中 用程序所需的一些资源,如图片、字符串等。每一种资 的标记编写了方法来实现对XML文档的解析。 ・92- 计算机技术与发展 第23卷 DOM解析XML文件时,会将XML文件的所有内 容以文档树方式存放在内存中,然后使用DOM API遍 历XML树、检索所需的数据。使用DOM[6 操作XML 的代码比较直观,编码比SAX的实现简单,但是,DOM 需要将XML文件的所有内容存放到内存中,所以内存 使用SQLite数据库。 2.3.2实现方法 Android系统提供了SQLiteOpenHelper抽象类,通 过继承该SQLiteOpenHelper类并重写onCreate()、 onUpgrade()这两个方法来实现数据库的创建及升级 更新。数据库默认存储在data/<包名>/databases/ 下,也可通过android.OS.Environment.getExternalStor- 的消耗较大,对于运行Android的移动设备来说,设备 资源比较宝贵,不适合使用。 Pull解析器是Android系统内置用来解析XML文 ageDireetory().getAbsolutePath()方法获取SDCard卡 件的。也提供了事件,可以使用parser.next()进入下 一目录并将数据库存储在SDCard卡上。代码如下: public class DBOpenHelper extends SQLiteOpenHelper{ 个元素并触发相应事件 。事件将作为数值代码 被发送。Pull解析代码如下: XmlPullParser parser:Xm1.newPullParser();//得到一个 Pull解析器 parser.setInput(instream,”UTF一8”); int eventType parser.getEventType(); while(eventType!=XmlPullParser.END—DOCUMENT){ switch(eventType){ case XmlPullParser.START_DOCUMENT://XML文档开始 break; case XmluPllParser.STARTJAG://元素开始标记 break; case XmlPullParser.END_TAG://元素结束标记 break; { eventType parser.next(); 另外有时也需要生成一个XML文件,生成XML 文件的方法有很多。如:可以只使用一个StringBuilder 组拼XML内容,然后把内容写入到文件中;也可以使 用DOM API生成XML文件,或者使用Pull解析器生 成XML文件,根据编码的直观性和执行效率,使用 Pull解析器较适合。 2.3 SQL.te数据库数据存储访问机制 2.3.1原理 SQLite是一个轻量级嵌入式数据库引擎,它支持 SQL语言,并且只占用很少的内存。它由SQL编译 器、内核、后端以及附件四个部分组成。SQLite在创建 表时,可以把任何数据类型放人任何列中;在插入数据 时,如果该类型与关联的列不匹配,则SQLite会尝试 将该值转换成该列的类型,如果不能转换,则该值将作 为其本身具有的类型存储。 对于熟悉Java EE的开发人员,在Android开发中 使用SQLite比较简单。但是,由于JDBC消耗资源太 多,所以JDBC对于智能终端类内存受限的设备来说 并不合适。因此,Android系统提供了一些新的API来 private static final String DBName=”nnutc.db”: private static final int DBVersion=1; public DBOpenHelper(Context context,int DBVersion){ super(context,DBName,null,DBVersion); } public void onCreate(SQLiteDatabase db){ db.execSQL(”CREATE TABLE IF NOT EXISTS person(per- sonid integer primary key autoincrement,”十”name varchar(20), age INTEGER)”); } public void onUpgrade(SQLiteDatabase db,int oldVemion,m’t newVersion){ db.execSQL(”ALTER TABLE person ADD COLUMN sex var- char(2)”); } } 为了实现数据库内容的增删改查,Android系统提 供了一个SQLiteDatabase的类,使用该类封装的方法 可以完成Insert、Select、Update和Delete等操作。执行 时用SQLiteDatabase类中的execSQL()和rawQuery() 方法。代码如下: SQLiteDatabase db=….: db.exeeSQL(”insertinto person(name,age)values( 张三 , 25)”); Cursor cursor=db.rawQuery(”select}from eprson”,nul1): while(cursor.moveToNext())} String name=cursor.getString(1);//获取第二列的值,第一 列的索引从0开始 } 查询语句执行后会返回一个Cursor,它是Android 系统的数据库游标,可以使用循环语句遍历所有记录。 2.4 ContentProvider共享数据机制 2.4.1 原 理 Android系统中的文件数据和数据库数据都是私 有的。一般情况下多个应用程序之间不能进行数据交 换。为了解决这个问题,它提供了ContentProvider类, 该类实现了一组标准的方法接El,能够让其他的应用 保存或读取此ContentProvider的各种数据。另外An— 第6期 倪红军:基于Android系统的数据存储访问机制研究 ・93・ droid系统也提供了一些已经在系统中实现的标准 3适用范围分析 ContentProvider,比如联系人信息、图片库等,开发者可 上述五种方式各有其优缺点,在进行应用开发时 以用这些ContentProvider来访问设备上存储的信息。 要根据不同的实际情况来选择,下面结合各种方式的 2.4.2实现方法 优缺点谈谈最合适的使用情况。 一个应用程序通过实现一个ContentProvider的抽 SharedPreferences是用来存储一些key—value对 象接口将数据暴露出去。常见的接口有query(通过 的基本数据类型,最适合使用SharedPreferences的地 Uri进行查询,返回一个Cursor)、insert(将一组数据插 方就是保存配置信息。当然由于SharedPreferences使 入到uri指定的地方)、update(更新Uri指定位置的数 用十分方便,所以能用它就尽量不要用文件或是数据 据)、delete(删除指定Uri并符合一定条件的数据), 库。对于数据量大的应用,就需要选择文件或数据库 每个ContentProvider定义一个唯一的公开的Uri,用于 存储。由于智能终端的网络稳定性,以及所产生的流 指定它的数据集。Uri由3个部分组成,“content://”, 量等因素,对使用网络存储有很大影响。但若是非常 代表数据的路径和一个可选的标识数据的ID。 重要的实时数据,或是需要发送给远端服务器处理的, 当外部应用程序需要对ContentProvider中的数据 就必须使用网络时进行实时发送。 进行添加、删除、修改和查询操作时,使用ContentRe. solver类来完成 。代码如下: 4结束语 Content Resolver res01ver=getcontentResolver(); 文中对Android系统的五种存储访问机制进行研 Uri uri=Uri.parse(”content://<包名>/person”); ContentValue scontentValues=new ContentValues(); 究,在阐述其实现原理的同时,展示了各种方式的实现 contentValues.put(”name”,”李小乐”); 代码,最后通过对各种方式优缺点的分析,给出了一般 resolver.insert(ufi,contentValues);//添加一条记录 适用范围,为理解Android存储访问机制的原理,合理 Cursor cursor=resolver.query(uri,null,null,null,”person- 使用相应接口,应用程序的开发颇有好处。 id dese”);//获取person表中所有记录 Uri updateIdUri=ContentUfis.withAppendedId(uri,2); 参考文献: resluver.update(updateldUri,contentValues,null,nul1);// [1] 公磊,周聪.基于Android的移动终端应用程序开发与 把id为2的记录的name字段值更改为李小乐 研究[J].计算机与现代化,2008(8):85—89. Uri deleteldUri:ContentUris.withAppendedId(uri,1); [2]代敏,张晶.基于Android平台的嵌入式软件“混合” resolver.delete(deleteIdUri,null,nul1);//删除id为1的记 定位控制策略研究[J].科学技术与工程,2012,12(5): 录 1161—1163. 2.5网络数据存储访问机制 [3]姚昱昱,刘卫国.Android的架构与应用开发研究[J].计算 2.5.I 原理 机系统应用,2008,17(11):110-112. 在实际开发时,有时也需要将数据以文件的方式 [4]朱珊娜,李书琴,安福定,等.XML文档到关系数据库的转 上传到服务器或者从服务器读取。Android系统的网 换研究[J].计算机工程与设计,2008,29(21):5507-5509. 络存储使用HTrP协议,由于Android是使用Java来 [5]Katysovas T.A ifsrt look at Google Android[D].Bohano:Free 开发的,所以网络开发也使用J2SE的包¨引。 University of Bohano,2008. [6]靳岩,姚尚朗.Google Android开发入门与实战[M].北 2.5.2实现方法 京:人民邮电出版社,2009. Android系统智能终端要实现与服务器交互数据 [7]郭宏志.Android应用开发详解[M].北京:电子工业出版 可以建立一个Web应用,在Web应用的相关请求处理 社。2010:190—192. 中接收Android提交的数据、返回XML数据或JSON [8]Google.Androidofifeialwebsite[EB/OL].[2009—11一10].ht・ 数据H 。Android系统终端发送相应的请求并接收 tp://www.android.corn. 服务器端传送的请求数据。代码如下: [9]王向辉,张国印,沈 洁.Android应用程序开发[M].北 URL url=new URL f”http://www.nnutc.edu.en/ie/ie. 京:清华大学出版社,2010. g ’); [1O]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版 HttpURLConnection conn:(HttpURLConnection)ur1.open— 社,2010. Connection(); [1 1]3GPPTS34.171.Termiml Conformance Speciifcation:Assisted conn.setConnectTimeout(6}1000); Global Positioning System[S].2004. lnputStream inStream=conn.getInputStream(); [12]Deitel P J,Deitel H M.Java for programmers[M].张君施, 获得InputStream后对数据的操作与J2SE类似。 译.北京:电子工业出版社,2010. 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务