Download presentation
Presentation is loading. Please wait.
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
Similar presentations