第6章-Android数据存储_第1页
第6章-Android数据存储_第2页
第6章-Android数据存储_第3页
第6章-Android数据存储_第4页
第6章-Android数据存储_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章Android数据存储,本章主要内容,Android数据基本存储方式Android数据库编程SQLite,Android数据基本存储方式,Android数据基本存储方式-SharedPreferences,Android中的SharedPreferences是用来存储简单数据的一个工具类,这个工具类与Cookie的概念相似,它通过用键值对的方式把简单的数据存储在应用程序的私有目录(data/data/shared_prefs/)下指定的xml文件中。,SharedPreferences提供了一种轻量级的数据存储方式,通过edit()方法来修改存储内容,通过commit()方法提交修改后的

2、内容。,SharedPreferences的重要方法,contains(Stringkey):检查是否已存在key这个关键字。edit():为preferences创建编辑器Editor,通过Editor可以修改preferences里面的数据,通过执行commit()方法提交修改。getAll():返回preferences所有的数据(Map)。getBoolean(Stringkey,booleandefValue):获取Boolean型数据getFloat(Stringkey,floatdefValue):获取Float型数据getInt(Stringkey,intdefValue):获

3、取Int型数据getLong(Stringkey,longdefValue):获取Long型数据,getString(Stringkey,StringdefValue):获取String型数据registerOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListenerlistener):注册一个当preference被改变时调用的回调函数。unregisterOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPrefere

4、nceChangeListenerlistener):删除回调函数。,SharedPreferences的重要方法,SharedPreferences示例,SharedPreferences关键代码(保存数据),save.setOnClickListener(newOnClickListener()OverridepublicvoidonClick(Viewv)SharedPreferencessettings=getSharedPreferences(SETTING_INFOS,0);/获取SharedPreferences对象/关键代码:保存用户名、密码及性别settings.edit()

5、.putString(NAME,username.getText().toString().putString(PASSWORD,passwd.getText().toString().putInt(SEX,sex.getSelectedItemPosition().commit(););,SharedPreferences保存数据的原理,当保存按钮时,会首先通过getSharedPreferences()方法得到settings,然后调用edit()方法得到编辑器Editor,使用Editor的putString和putInt将编辑框及下拉列表的值进行修改,最后使用commit()方法将数据

6、提交保存。SharedPreferences以xml文件保存需要保存的值,更重要的是SharedPreferences只能由所属package的应用程序使用,而不能被其他应用程序使用,从而提高了安全性。,Android数据基本存储方式-Files,虽然SharedPreferences可以非常方便的存储数据,但是这种方式只适用于比较少量的数据,在大量数据需要存储时,可以借助于文件存储的功能。借助于JAVA文件I/O类,使用FileInputStream和FileOutputStream类来读取和写入文件,典型代码:,StringFILE_NAME=filename.txt;/确定要操作文件的文

7、件名FileOutputStreamfos=openFileOutput(FILE_NAME,Context.MODE_PRIVATE);/创建输出流FileInputStreamfis=openFileInput(FILE_NAME);/创建输入流,使用文件输入输出流的注意事项,若创建FileOutputStream时指定的文件不存在,系统会自动创建这个文件。默认的写入操作会覆盖源文件的内容,如果想要把新写入的内容附加在原文件的内容之后,可以指定模式为Context.MODE_APPEND。默认地,使用openFileOutput方法打开的文件只能被其调用的应用程序使用,其他应用程序将无法读

8、取这个文件。如果需要在不同的应用程序中共享数据,可以使用ContentProvider(将在后面提到)。,Files示例,Files示例,Files示例代码说明savefile方法,protectedvoidsavefile()throwsIOExceptionFileOutputStreamfos=newFileOutputStream(mTextFile);fos.write(et.getText().toString().getBytes();fos.flush();/确保输出完毕fos.close();,该方法用于保存文件。保存文件的过程就是先使用FileOutputStream创建输

9、出流,然后获取待写入到文件中的数据并写入文件中。FileOutputStream写文件的方法是使用write()方法,使用flush()方法保证输出流写入完成,最后使用close()方法关闭输出流,文件保存完毕。,Files示例代码说明helpdoc方法,privatevoidhelpdoc()throwsIOExceptionsave.setClickable(false);save.setEnabled(false);tw.setText(帮助文档,不可编辑);StringmyString=null;InputStreamis=getApplicationContext().getCont

10、entResolver().openInputStream(Uri.parse(android.resource:/+com.android.example.fileiodemo/+R.raw.help);BufferedInputStreambis=newBufferedInputStream(is);ByteArrayBufferbaf=newByteArrayBuffer(8192);intcurrent=0;while(current=bis.read()!=-1)baf.append(byte)current);myString=newString(baf.toByteArray()

11、,GBK);et.setText(myString);,显示该程序的帮助文档。,Files示例代码说明readfile方法,privatevoidreadfile(Filefile)throwsIOExceptionmTextFile=file;tw.setText(正在编辑文件+mTextFile.getName();if(!mTextFile.exists()Log.v(duanhong,创建文件);if(!mTextFile.createNewFile()Log.v(duanhong,创建文件失败);return;StringmyString=null;InputStreamis=new

12、FileInputStream(mTextFile);/创建写入流BufferedInputStreambis=newBufferedInputStream(is);ByteArrayBufferbaf=newByteArrayBuffer(8192);intcurrent=0;while(current=bis.read()!=-1)baf.append(byte)current);myString=newString(baf.toByteArray();et.setText(myString);,用于打开文件。该例中文件打开需要的步骤是使用FileInputStream得到待打开文件的输入

13、流,然后从输入流中读出所包含的数据内容并显示到文本框中。,Android数据基本存储方式-ContentProvider,在Android中,使用URI(UniformResourceIdentifier,统一资源标识符)来定位文件和数据资源。相比常见的与之容易混淆的URL(UniformResourceLocator,统一资源定位器),URL是用于标识资源的物理位置,相当于文件的路径;而URI则是标识资源的逻辑位置,并不提供资源的具体位置。例如Android通讯录中的数据,如果使用URL来标识,可能会是一个很复杂的定位结构,,并且一旦文件的存储路径改变,URL也必须随之改动;而对于URI,可

14、以用诸如content:/contract/people这样的逻辑地址来标识,对于用户来说,这种方式不需要关心文件的具体位置,即使文件位置改动也不需要变化,后台程序中URI到具体位置的映射通过程序员来进行维护。,ContentProvider简介,ContentProvider是应用程序私有数据对外的接口,程序通过ContentProvider访问数据时不需要关心数据具体的存储及访问过程,这样的方式既提高了数据的访问效率,同时也保护了数据。Activity类中有一个继承自ContentWapper的getContentResolver()无参数方法,该方法返回一个ContentResolver

15、对象,通过调用其query、insert、update、delete方法访问数据。这几个方法的第一个参数均为URI,用来标识需要访问的资源或数据库。,ContentProvider格式,ContentProviderURI固定的形式如下,以联系人为例:,A:类似于URL中的http:/、ftp:/等等;B:资源的唯一标识符,可以理解为数据库名;C:具体的资源类型,可以理解为数据库表名。D:ID号,用于指定一条数据,可以理解为数据库中的某一行的id。,Android数据库编程SQLite,SQLite简介,SQLite是一款开源的轻量级嵌入式关系型数据库。它在2000年由D.RichardHip

16、p发布,支持Java、Net、PHP、Ruby、Python、Perl、C等几乎所有的现代编程语言,并且支持Windows、Linux、Unix、MacOS、Android、iOS等几乎所有的主流操作系统平台。SQLite被广泛应用的在苹果、Adobe、Google的各项产品中。日常生活中所使用到的诸多应用程序中也不难发现SQLite的影子,如果读者的计算机中装有迅雷,请打开迅雷安装目录,搜索SQLite3.dll就能够发现该文件,从名称上基本能够说明迅雷使用了SQLite作为其数据库;还有金山词霸,它的安装目录中也能够发现SQLite.dll的存在。是的,SQLite早就广泛的应用在日常生活

17、中人们所接触的各种产品中了,在Android中也内置了完整支持的SQLite数据库。,SQLite特性,遵守ACID;零配置无需安装和管理配置;储存在单一磁盘文件中的一个完整的数据库;数据库文件可以在不同字节顺序的机器间自由的共享;支持数据库大小至2TB;足够小,约3万行C代码,250K;比一些流行的数据库在大部分普通数据库操作要快;简单的API;包含TCL绑定,同时通过Wrapper支持其他语言的绑定;良好注释的源代码,并且有着90%以上的测试覆盖率;独立:没有额外依赖;Source完全的Open,可以用于任何用途,包括出售它;支持多种开发语言:C、PHP、Perl、Java、ASP.NET

18、和Python。,SQLite示例,SQLite示例,SQLite关键代码-DBHelper,创建数据库,publicclassDBHelperextendsSQLiteOpenHelperContextcontext;/应用环境上下文privatestaticSQLiteDatabasedb;/该辅助类维护的数据库对象publicStringtable_name=files;/数据库表名privatestaticfinalStringTAG=duanhong;/调试标签privateStringname;/数据库名publicDBHelper(Contextcontext,Stringnam

19、e,CursorFactoryfactory,intversion)super(context,name,factory,version);this.context=context;=name;db=context.openOrCreateDatabase(name,Context.MODE_PRIVATE,null);drop_table();/清除数据库,便于测试CreateTable();/辅助类建立时运行该方法建立数据库,SQLite关键代码-DBHelper,创建表,privatevoidCreateTable()try/使用execSQL方法执行sql语句完成数据

20、库表创建db.execSQL(CREATETABLEIFNOTEXISTS+table_name+(+_idINTEGERPRIMARYKEYAUTOINCREMENTNOTNULL,+fileNameVARCHAR,descriptionVARCHAR+););Log.v(TAG,CreateTablefilesok);catch(Exceptione)Log.v(TAG,e.toString();,SQLite关键代码-DBHelper,初始化表,/初始化表,使用SQLiteDatabase提供的insert方法插入一行数据publicvoidinitDatabase()ContentVa

21、luescv=newContentValues();/数据集,表示一行数据cv.put(fileName,Test);cv.put(description,初始化测试项);db.insert(table_name,cv);,SQLite关键代码-DBHelper,插入条目,publicbooleaninsert(Stringfilename,Stringdescription)Stringsql=;try/打开数据库供后续操作使用db=context.openOrCreateDatabase(name,Context.MODE_PRIVATE,null);sql=insertintofiles

22、values(null,+filename+,+description+);db.execSQL(sql);Log.v(TAG,insertTablefilesok);returntrue;catch(Exceptione)Log.v(TAG,insertTablefileserr,sql:+sql);returnfalse;,SQLite关键代码-DBHelper,删除条目,publicbooleandelete(intfileid)Stringsql=;trydb=context.openOrCreateDatabase(name,Context.MODE_PRIVATE,null);sq

23、l=deletefromfileswhere_id=+fileid;db.execSQL(sql);Log.v(TAG,deleteitemok);returntrue;catch(Exceptione)Log.v(TAG,deleteitemerr,sql:+sql);returnfalse;,SQLite关键代码-DBHelper,修改条目,publicbooleanupdate(intfileid,Stringfilename,Stringdescription)Stringsql=;trydb=context.openOrCreateDatabase(name,Context.MODE_PRIVATE,null);sql=updatefilessetfileName=+filename+,description=+description+where_id=+fileid;db.execSQL(sql);Log.v(TAG,updateTablefilesok);r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论