1 / 61

基于 Android 的移动应用开发

基于 Android 的移动应用开发. 数据存储与访问. 数据存储与访问. Android 提供的方法 Shared Preferences Store private primitive data in key-value pairs. Internal Storage Store private data on the device memory. External Storage Store public data on the shared external storage. SQLite Databases

Télécharger la présentation

基于 Android 的移动应用开发

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 基于Android的移动应用开发 数据存储与访问

  2. 数据存储与访问 • Android 提供的方法 • Shared Preferences • Store private primitive data in key-value pairs. • Internal Storage • Store private data on the device memory. • External Storage • Store public data on the shared external storage. • SQLite Databases • Store structured data in a private database. • Network Connection • Store data on the web with your own network server. • Content provider • expose your private data to other applications 

  3. 数据存储与访问 掌握SharedPreferences的使用方法 掌握各种文件存储的区别与适用情况 了解SQLite数据库的特点和体系结构 掌握SQLite数据库的建立和操作方法 理解ContentProvider的用途和原理 掌握ContentProvider的创建与使用方法 3

  4. SharedPreferences SharedPreferences是一种轻量级的数据保存方式 通过SharedPreferences可以将NVP(Name/Value Pair,名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的操作过程 开发人员仅是通过调用SharedPreferences对NVP进行保存和读取 4

  5. SharedPreferences 5 • SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享 • SharedPreferences支持三种访问模式 • 私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入 • 全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限 • 全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限

  6. SharedPreferences 6 • 在使用SharedPreferences前,先定义SharedPreferences的访问模式 • 下面的代码将访问模式定义为私有模式 • 有的时候需要将SharedPreferences的访问模式设定为既可以全局读,也可以全局写,这样就需要将两种模式写成下面的方式

  7. SharedPreferences • 在应用中获得首选项的方法 • getSharedPreferences() • 一个activity可以使用多个首选项文件,以第一个参数为标识 • getPreferences() • 一个activity只有一个首选项文件

  8. SharedPreferences 8 • 定义SharedPreferences的名称,这个名称与在Android文件系统中保存的文件同名。因此,只要具有相同的SharedPreferences名称的NVP内容,都会保存在同一个文件中 • 为了可以使用SharedPreferences,需要将访问模式和SharedPreferences名称作为参数,传递到getSharedPreferences()函数,并获取到SharedPreferences对象

  9. SharedPreferences 9 • 在获取到SharedPreferences对象后,则可以通过SharedPreferences.Editor类对SharedPreferences进行修改,最后调用commit()函数保存修改内容 • SharedPreferences广泛支持各种基本数据类型,包括整型、布尔型、浮点型和长型等等

  10. SharedPreferences 10 • 如果需要从已经保存的SharedPreferences中读取数据,同样是调用getSharedPreferences()函数,并在函数的第1个参数中指明需要访问的SharedPreferences名称,最后通过get<Type>()函数获取保存在SharedPreferences中的NVP • get<Type>()函数的第1个参数是NVP的名称 • 第2个参数是在无法获取到数值的时候使用的缺省值

  11. SharedPreferences 11 • 访问其他应用程序的SharedPreferences必须满足三个条件 • 共享者需要将SharedPreferences的访问模式设置为全局读或全局写 • 访问者需要知道共享者的包名称和SharedPreferences的名称,以通过Context获得SharedPreferences对象,调用createPackageContext()方法 • 访问者需要确切知道每个数据的名称和数据类型,用以正确读取数据

  12. SharedPreferences-TodoList4 • TodoList活动中的实例状态 • 是否是一个添加的新数据项 • 文本框中的文本是什么 • 当前所选择的数据项是什么

  13. SharedPreferences-TodoList4 • 步骤1:添加作为首选项键的字符串变量

  14. SharedPreferences-TodoList4 • 步骤2:重写onPause方法

  15. SharedPreferences-TodoList4 • 步骤3:编写restoreUIState方法,并在onCreate方法中调用该方法。

  16. SharedPreferences-TodoList4 • 步骤4:使用onSaveInstanceState / onRestoreInstanceState机制来记录已选择的数据项索引

  17. SharedPreferences-TodoList4 • 步骤4:使用onSaveInstanceState / onRestoreInstanceState机制来记录已选择的数据项索引

  18. SharedPreferences-TodoList4 • 运行效果:

  19. 文件存储 19 Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件

  20. 文件存储 20 • Android系统允许应用程序创建仅能够自身访问的私有文件 • Android系统不仅支持标准Java的IO类和方法,还提供了能够简化读写流式文件过程的函数 • 主要介绍的两个函数 • openFileOutput() • openFileInput()

  21. 文件存储 21 • openFileOutput()函数 • openFileOutput()函数为写入数据做准备而打开的应用程序私文件,如果指定的文件不存在,则创建一个新的文件 • openFileOutput()函数的语法格式如下 • 第1个参数是文件名称,这个参数不可以包含描述路径的斜杠 • 第2个参数是操作模式 • 函数的返回值是FileOutputStream类型

  22. 文件存储 22 • openFileOutput()函数 • Android系统支持四种文件操作模式

  23. 文件存储 23 • openFileOutput()函数 • 使用openFileOutput()函数建立新文件的示例代码如下 • 第1行代码定义了建立文件的名称fileDemo.txt • 第2行代码使用openFileOutput()函数以私有模式建立文件 • 第4行代码调用write()函数将数据写入文件 • 第5行代码调用flush()函数将所有剩余的数据写入文件 • 第6行代码调用close()函数关闭FileOutputStream

  24. 文件存储 24 • openFileOutput()函数 • 为了提高文件系统的性能,一般调用write()函数时,如果写入的数据量较小,系统会把数据保存在数据缓冲区中,等数据量累积到一定程度时再一次性的写入文件中 • 由上可知,在调用close()函数关闭文件前,务必要调用flush()函数,将缓冲区内所有的数据写入文件

  25. 文件存储 25 • openFileInput()函数 • openFileInput()函数为读取数据做准备而打开应用程序私文件 • openFileInput()函数的语法格式如下 • 参数为文件名称,不允许包含描述路径的斜杠

  26. 文件存储 26 • openFileInput()函数 • 使用openFileInput ()函数打开已有文件的示例代码如下 • 上面的两部分代码在实际使用过程中会遇到错误提示,因为文件操作可能会遇到各种问题而最终导致操作失败,因此代码应该使用try/catch捕获可能产生的异常

  27. 文件存储 27 • 资源文件 • 程序开发人员可以将程序开发阶段已经准备好的原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问 • 原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件和数据文件等等,在应用程序编译和打包时,/res/raw目录下的所有文件都会保留原有格式不变 • /res/xml目录下的XML文件,一般用来保存格式化的数据,在应用程序编译和打包时会将XML文件转换为高效的二进制格式,应用程序运行时会以特殊的方式进行访问

  28. 文件存储 28 res/raw文件夹下的资源文件读取 调用Resource对象上的openRawResource方法,传入文件名(不带扩展名)作为R.raw类的变量名

  29. 文件存储 29 • /res/xml目录下的XML文件会转换为一种高效的二进制格式 • 说明如何在程序运行时读取/res/xml目录下的XML文件 • 首先在/res/xml目录下创建一个名为people.xml的文件 • XML文件定义了多个<person>元素,每个<person>元素都包含三个属性name、age和height,分别表示姓名、年龄和身高 • /res/xml/people.xml文件代码如下

  30. 文件存储 30 • 读取XML格式文件 • 首先通过调用资源对象的getXml()函数,获取到XML解析器XmlPullParser • XmlPullParser是Android平台标准的XML解析器,这项技术来自一个开源的XML解析API项目XMLPULL • ResourceFileDemo示例中关于读取XML文件的核心代码如下

  31. 文件存储 31

  32. 文件存储 32 • 第1行代码通过资源对象的getXml()函数获取到XML解析器 • 第4行代码的parser.next()方法可以获取到高等级的解析事件,并通过对比确定事件类型 • 第5行代码使用getName()函数获得元素的名称 • 第10行代码使用getAttributeCount()函数获取元素的属性数量 • 第12行代码通过getAttributeName()函数得到属性名称 • 第14行到第19行代码通过分析属性名获取到正确的属性值 • 第23行代码将属性值整理成需要显示的信息

  33. 文件存储 33 • XmlPullParser的XML事件类型

  34. 文件存储 34 • Android 文件管理 • public boolean deleteFile (String name) • 使用户能够删除由当前应用程序所创建的文件 • public String[] fileList () • 返回一个字符串列表,包含了当前应用程序所创建的所有文件

  35. 数据库存储 SQLite是一种流行的关系数据库管理系统 开源、兼容标准、轻量级、单层 被实现为一个简洁的C库,作为Android软件栈的一部分 列定义中使用一种松散类型的方法,不要求一列中的所有值都是同一种类型 http://www.sqlite.org 35

  36. 数据库存储 36 • 通过创建一个辅助类来简化数据库交互是一种很好的做法 • 一般将所有对数据库的操作都封装在一个类中,因此只要调用这个类,就可以完成对数据库的添加、更新、删除和查询等操作

  37. 数据库存储 37 下面内容是MyDBAdapter类的部分代码,封装了数据库的建立、打开和关闭等操作

  38. 数据库存储 38

  39. 数据库存储 39

  40. 数据库存储 40

  41. 数据库存储 41

  42. 数据库存储 42 • SQLiteOpenHelper是一个抽象类,用来实现创建、打开和升级数据库的最佳实践模式 • 调用getReadableDatabase或者getWriteableDatabase来打开和返回一个可读/可写的底层数据库实例 • 由于磁盘空间或者权限问题,对getWriteableDatabase的调用可能失败,较好的做法是提供一个对getReadableDatabase方法的回退

  43. 数据库存储 43

  44. 数据库存储 44 • 如果程序开发人员不希望使用SQLiteOpenHelper类,同样可以直接创建数据库 • 首先调用openOrCreateDatabases()函数创建数据库对象 • 然后执行SQL命令建立数据库中的表和直接的关系 • 示例代码如下

  45. 数据库存储 45 • 数据操作 • 数据操作是指对数据的添加、删除、查找和更新的操作 • 可以通过执行SQL命令完成数据操作,execSQL()方法 • 但推荐使用Android提供的专用类和方法,这些类和方法更加简洁、易用

  46. 数据库存储 46 • 数据操作 • SQLiteDatabase类的公共函数insert()、delete()、update()和query(),封装了执行的添加、删除、更新和查询功能的SQL命令 • 下面分别介绍如何使用SQLiteDatabase类的公共函数,完成数据的添加、删除、更新和查询等操作

  47. 数据库存储 47 • 添加功能 • 首先构造一个ContentValues对象,然后调用ContentValues对象的put()方法,将每个属性的值写入到ContentValues对象中,最后使用SQLiteDatabase对象的insert()函数,将ContentValues对象中的数据写入指定的数据库表中 • insert()函数的返回值是新数据插入的位置,即ID值。ContentValues类是一个数据承载容器,主要用来向数据库表中添加一条数据

  48. 数据库存储 48 • 删除功能 • 删除数据比较简单,只需要调用当前数据库对象的delete()函数,并指明表名称和删除条件即可 • delete()函数的第1个参数是数据库的表名称,第2个参数是删除条件 • 在第2行代码中,删除条件为null,表示删除表中的所有数据 • 第6行代码指明了需要删除数据的id值,因此deleteOneData()函数仅删除一条数据,此时delete()函数的返回值表示被删除的数据的数量

  49. 数据库存储 49 • 更新功能 • 更新数据同样要使用ContentValues对象,首先构造ContentValues对象,然后调用put()函数将属性的值写入到ContentValues对象中,最后使用SQLiteDatabase对象的update()函数,并指定数据的更新条件

  50. 数据库存储 50 • 查询功能 • 首先介绍Cursor类。在Android系统中,数据库查询结果的返回值并不是数据集合的完整拷贝,而是返回数据集的指针,这个指针就是Cursor类 • Cursor类支持在查询的数据集合中多种方式移动,并能够获取数据集合的属性名称和序号

More Related