Presentation is loading. Please wait.

Presentation is loading. Please wait.

数据存储.

Similar presentations


Presentation on theme: "数据存储."— Presentation transcript:

1 数据存储

2 Android数据存储方式 SharePreferences 文件 SQLite数据库 ContentProvider
轻量级键-值方式存储,以XML文件方式保存。存储小数据。 文件 采用java.io.*库所提供有I/O接口,读写文件。 内部存储(小、中)和外部存储(大文件)。 SQLite数据库 SQLite是轻量级嵌入式内置数据库。存储结构化的私有数据。 ContentProvider ContentProvider可为数据封装,为多个应用共享。

3 SharedPreferences 持久化的Map 以「键-值对」的方式保存简单数据类型 跨Session自动持久化数据
通常用来保存需要长期存储的应用程序数据 用户名 常用的wifi网络 用户自定义数据 目录:/data/data/<包>/shared_prefs/***.xml

4 Activity的SharedPreferences
Activity.getPreferences(int mode) MODE_PRIVATE: 缺省,创建的文件只有当前程序能访问 MODE_WORLD_READABLE MODE_WORLD_WRITEABLE

5 命名的SharedPreferences
Context.getSharedPreferences( String name, int mode) name: SharedPreferences文件名 mode: 模式

6 向SharedPreferences写数据
调用SharedPreferences.edit() 返回一个SharedPreferences.Editor实例 putInt(String key, int value) putString(String key, int value) remove(String key) 提交修改 SharedPreferences.Editor.commit()

7 读取SharedPreferences 使用SharedPreferences的方法读取数据 getAll()
getBoolean(String key, boolean defValue) getString(String key, String defValue)

8 清除SharedPreferences Editor.clear().commit()

9 示例

10 文件 该类表示由路径名表示的文件系统中的一个对象 内部存储通常用来存放小的程序私有数据 外部存储通常用来存放大的非私有数据集
采用java.io.*库所提供有I/O接口,读写文件。

11 文件的API FileOutputStream FileInputStream 参见文档
OpenFileOutput(String name, int mode) 打开私有文件进行写入。 如果文件不存在先创建。 FileInputStream OpenFileInput(String name) 打开私有文件进行读取 当文件不存在时抛出FileNotFoundException 异常 参见文档

12 使用外部内存文件 可移动设备会在没有警告的情况下引起文件出现/消失 检查设备状态
String Environment.getExternalStorageState() MEDIA_MOUNTED: 已装载,可读写 MEDIA_MOUNTED_READ_ONLY: 已装载,只读 MEDIA_REMOVED: 没有装载

13 使用外部存储文件 添加权限 <use-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>

14 Cache文件(临时文件) 当可用空间不够时可能会被删除 当应用程序卸载时会被删除 File Context.getCacheDir()
获取一个该程序临时目录的绝对路径,可用于存放临时文件 Context.getExternalCacheDir() 返回外部存储中存放临时文件的一个目录

15 读取资源中的静态文件 要打开打包在应用程序中的静态文件,使用Resources.openRawResource(R.raw.mydatafile) 该文件必须放在文件夹res/raw/中 InputStream in = this.getResources().openRawResource(R.raw.my); in.close();

16 示例

17 SQLite 提供内存数据库 专门设计,占用内存很小(300kB) 实现了大部分SQL92 支持ACID事务
Atomic, Consistent, Isolated & Durable

18 SQLite 在某些情况下,文件不是有效的 内置SQLite 数据库支持 如果多线程数据访问是相关的 如果应用程序处理可能变化的复杂数据结构
等等 内置SQLite 数据库支持 数据库对于创建它们的包是私有的 数据库不应该用来存贮文件

19 数据库 SQLiteDatabase: 封装了一些操作数据库的API(CRUD) 添加(Create) 查询(Retrieve)
更新(Update) 删除(Delete)

20 创建数据库 SQLiteDatabase.create Context.openOrCreateDatabase
创建内存数据库 Context.openOrCreateDatabase 打开一个私有的数据库,如果数据库不存在则创建一个新的数据库 推荐方法:继承自SQLiteOpenHelper

21 SQLiteOpenHelper 管理数据库的创建和升级 用户创建一个该类的子类,重写:
onCreate onUpgrade onOpen(可选) db = dbhelper.getWritableDatabase();

22 使用数据库(SQLiteDatabase)
用SQLiteOpenHelper方法打开、返回底层数据库 对底层数据库执行相应的操作

23 使用数据库(SQLiteDatabase)
execSQL 可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句 SQLiteDatabase db = ....; db.execSQL(“insert into person(name, age) values(‘Tom', 20)"); db.close(); rawQuery 可以执行select语句。

24 示例

25 ContentProvider 表示结构化的数据集 对数据集进行包装 对数据访问添加权限 用于程序间的数据共享
客户端通过ContentResolver访问ContentProvider

26 ContentResolver 通过数据库形式的接口对数据进行读取、写入 提供额外的服务,比如变更通知 数据模型:数据库表
查询、插入、更新、删除…… 提供额外的服务,比如变更通知 数据模型:数据库表 Context.getContentResolver()

27 ContentProvider & ContentResolver
通过这些类,可以是运行在一个进程中的代码访问另一个进程管理的数据

28 Android内置的ContentProvider
浏览器 —— 书签、历史等 通话记录 —— 电话的使用情况 通讯录 —— 联系人数据 媒体 —— 媒体数据库 用户词典 —— 用于预测拼写的数据库 更多……

29 URI Content Provider通过URI进行访问 URI的格式确定了指定的数据集是由哪个ContentProvider管理的
content://authority/path/id content: scheme authority: Content Provider的ID path: 0或多个部分,用来方式数据是如何访问的 id: 请求的指定记录

30 查询 ContentResolver.query() 返回一个Cursor,可以对结果集进行遍历

31 删除 ContentResolver.delete() 返回删除的行数

32 插入 ContentResolver.insert() 返回插入行的URI

33 更新 ContentResolver.update() 返回更新的行数

34 ContentProviderOperation

35 示例

36 创建自己的ContentProvider
实现数据的存储系统 定义一个Contract类来支持所创建ContentProvider的用户 实现一个ContentProvider的子类 在AndroidManifest.xml中声明、配置Content Provider


Download ppt "数据存储."

Similar presentations


Ads by Google