第十三章
数据存储
某著名企业
掌握SharedPreferences的使用方法
掌握各种文件存储的区别与适用情况
了解SQLite数据库的特点和体系结构
掌握SQLite数据库的建立和操作方法
本章目标
某著名企业
本章任务
掌握SharedPreferences使用
掌握SQLite的使用
某著名企业
简单储存
SharedPreferences:
SharedPreferences是一种轻量级的数据保存方式
通过SharedPreferences可以将NVP(Name/Value Pair,名
称/值对)保存在Android的文件系统中,而且
SharedPreferences完全屏蔽的对文件系统的操作过程
开发人员仅是通过调用SharedPreferences对NVP进行保存和
读取
某著名企业
简单储存
SharedPreferences:
在使用SharedPreferences前,先定义SharedPreferences
的访问模
下面的代码将访问模式定义为私有模式
有的时候需要将SharedPreferences的访问模式设定为即可
以全局读,也可以全局写,这样就需要将两种模式写成下
面的方式
public static int MODE = MODE_PRIVATE;
public static int MODE = _WORLD_READABLE +
_WORLD_WRITEABLE;
某著名企业
简单储存
SharedPreferences:
定义SharedPreferences的名称,这个名称与在Android文
件系统中保存的文件同名。因此,只要具有相同的
SharedPreferences名称的NVP内容,都会保存在同一个文
件中
为了可以使用SharedPreferences,需要将访问模式和
SharedPreferences名称作为参数,传递到getSharedPreferences
()函数,并获取到SharedPreferences对象
public static final String PREFERENCE_NAME = "SaveSetting";
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);
某著名企业
简单储存
SharedPreferences:
在获取到SharedPreferences对象后,则可以通过
类对SharedPreferences进行修
改,最后调mit()函数保存修改内容
SharedPreferences广泛支持各种基本数据类型,包括整型、
布尔型、浮点型和长型等等
editor = ();
("Name", "Tom");
("Age", 20);
("Height", );
editormit();
某著名企业
简单储存
SharedPreferences:
如果需要从已经保存的SharedPreferences中读取数据,同
样是调用getSharedPreferences()函数,并在函数的第1个
参数中指明需要访问的SharedPreferences名称,最后通过get<Type>
()函数获取保存在SharedPreferences中的NVP
<Type>()函数的第1个参数是NVP的名称
2.第2个参数是在无法获取到数值的时候使某省市值
SharedPreferences sharedPreferences = getSharedPreferences
(PREFERENCE_NAME, MODE);
String name = ("Name","Default
Name");
int age = ("Age", 20);
float height = ("Height",);
某著名企业
简单储存
示例:
通过SimplePreferenceDemo示例介绍具体说明
SharedPreferences的文件保存位置和保存格式
下图是SimplePreferenceDemo示例的用户界面
用户在界面上的输入的信息,将通过SharedPreferences
在Activity关闭时进行保存。当应用程序重新开启时,保
存在SharedPreferences的信息将被读取出来,并重新呈
现在用户界面上
某著名企业
简单储存
示例:
SimplePreferenceDemo示例运行后,通过FileExplorer查看
/data/data下的数据,Android为每个应用程序建立了与包同
名的目录,用来保存应用程序产生的数据,这些数据包括文
件、SharedPreferences文件和数据库等
SharedPreferences文件就保存在/data/data/<package
name>/shared_prefs目录下
某著名企业
简单储存
示例:
在本示例中,shared_prefs目录下生成了一个名为
的文件
这个文件就是保存SharedPreferences的文件,文件大小为
170字节,在Linux下的权限为“-rw-rw-rw”
某著名企业
简单储存
示例:
在Linux系统中,文件权限分别描述了创建者、同组用户和其他用
户对文件的操作限制。x表示可执行,r表示可读,w表示可写,d
表示目录,-表示普通文件。因此,“-rw-rw-rw”表示
可以被创建者、同组用户和其他用户进行读取和
写入操作,但不可执行
产生这样的文件权限与程序人员设定的SharedPreferences的访问
模式有关,“-rw-rw-rw”的权限是“全局读+全局写”的结果
如果将SharedPreferences的访问模式设置为私有,则文件权限将
成为“-rw-rw ---”,表示仅有创建者和同组用户具有读写文件
的权限
某著名企业
简单储存
示例:
文件是以XML格式保存的信息,内容如图
如下
<?xml version='' encoding='utf-8' standalone='yes' ?>
<map>
<float name="Height" value="" />
<string name="Name">Tom</string>
<int name="Age" value="20" />
</map>
某著名企业
简单储存
示例:
SimplePreferenceDemo示例在onStart()函数中调用loadSharedPreferences
()函数,读取保存在SharedPreferences中的姓名、年龄和身
高信息,并显示在用户界面上
当Activity关闭时,在onStop()函数调用saveSharedPreferences
(),保存界面上的信息
的完整代码
某著名企业
简单储存
package ;
import ;
import ;
import ;
import ;
import ;
public class SimplePreferenceDemo extends Activity {
private EditText nameText;
private EditText ageText;
private EditText heightText;
public static final String PREFERENCE_NAME = "SaveSetting";
public static int
MODE = _WORLD_READABLE + _WORLD_WRITEABLE;
public void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
setContentView();
nameText = (EditText)findViewById();
ageText = (EditText)findViewById();
heightText = (EditText)findViewById();
}
某著名企业
简单储存
public void onStart(){
();
loadSharedPreferences();
}
public void onStop(){
();
saveSharedPreferences();
}
private void loadSharedPreferences(){
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME,
MODE);
String name = ("Name","Tom");
int age = ("Age", 20);
float height = ("Height",);
(name);
((age));
((height));
}
某著名企业
简单储存
private void saveSharedPreferences(){
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NA
ME, MODE);
editor = ();
("Name", ().toString());
("Age", (().toString()));
("Height", (().toString()));
editormit();
}
}
某著名企业
简单储存
示例:
示例SharePreferenceDemo将说明如何读取其他应用程序保
存的SharedPreferences数据
下图是SharePreferenceDemo示例的用户界面
示例将读取SimplePreferenceDemo示例保存的信息,并在
程序启动时显示在用户界面上
某著名企业
简单储存
下面给出SharePreferenceDemo示例的核心代码
1. public static final
String PREFERENCE_PACKAGE = "";
2. public static final String PREFERENCE_NAME = "SaveSetting";
3. public static int
MODE = _WORLD_READABLE + _WORLD_WRITEABLE;
4. public void onCreate(Bundle savedInstanceState) {
5. Context c = null;
6. try {
7. c = (PREFERENCE_PACKAGE, _IGNORE_SECURIT
Y);
8. } catch (NameNotFoundException e) {
9. ();
10. }
11. SharedPreferences sharedPreferences = (PREFERENCE_NAME, MODE);
12. String name = ("Name","Tom");
13. int age = ("Age", 20);
14. float height = ("Height",);
15. }
某著名企业
简单储存
1. 第7行代码调用了createPackageContext()获取到了
SimplePreferenceDemo示例的Context
2. 第7行代码第1个参数是SimplePreferenceDemo的包名称,
在代码第1行进行了定义
3. 第2个参数_IGNORE_SECURIT表示忽略所
有可能产生的安全问题。这段代码可能引发异常,因此必
须防止在try/catch中
4.在代码第11行,通过Context得到了SimplePreferenceDemo
示例的SharedPreferences对象,同样在getSharedPreferences
()函数中,需要将正确的SharedPreferences名称传递给函
数
某著名企业
简单储存
访问其他应用程序的SharedPreferences必须满足三个条件
共享者需要将SharedPreferences的访问模式设置为全
局读或全局写
访问者需要知道共享者的包名称和SharedPreferences
的名称,以通过Context获得SharedPreferences对象
访问者需要确切知道每个数据的名称和数据类型,用以
正确读取数据
某著名企业
简单储存
Android使用的是基于Linux的文件系统,程序开发人员可
以建立和访问程序自身的私有文件,也可以访问保存在资
源目录中的原始文件和XML文件,还可以在SD卡等外部存储
设备中保存文件。按照保存文件位置的不同,可以分为以
下两种:
存储
外部存储
资源文件
某著名企业
简单储存
存储:
存储
Android系统允程序创建仅能够自身访问的私有文件,
文件保存在设备的存储器上,在Linux系统下的
/data/data/<package name>/files目录中
Android系统不仅支持标准Java的IO类和方法,还提供
了能够简化读写流式文件过程的函数
主要可以用以下两个函数进行操作:
openFileOutput()
openFileInput()
某著名企业
简单储存
外部存储:
Android的外部存储设备指的是SD卡(Secure Digital Memory
Card),是一种广泛使用于数码设备上的记忆卡
不是所有的Android手机都有SD卡,但Android系统提供了对SD卡
的便捷的访问方法
SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的
文件,可以保存录制的大容量的视频文件和音频文件等
SD卡使用的是FAT(File Allocation Table)的文件系统,不
支持访问模式和权限控制,但可以通过Linux文件系统的文件
访问权限的控制保证文件的私密性
Android模拟器支持SD卡,但模拟器中某省市的SD卡,开发人
员须在模拟器中手工添加SD卡的映像文件
某著名企业
简单储存
资源文件:
程序开发人员可以将程序开发阶段已经准备好的原始格式
文件和XML文件分别存放在/res/raw和/res/xml目录下,供
应用程序在运行时进行访问
原始格式文件可以是任何格式的文件,例如视频格式文件、
音频格式文件、图像文件和数据文件等等,在应用程序编
译和打包时,/res/raw目录下的所有文件都会保留原有格
式不变
/res/xml目录下的XML文件,一般用来保存格式化的数据,
在应用程序编译和打包时会将XML文件转换为高效的二进制
格式,应用程序运行时会以特殊的方式进行访问
某著名企业
简单储存
SQLite数据库
SQLite是一个开源的嵌入式关系数据库,在2000年由D.
Richard Hipp发布
SQLite数据库特点
更加适用于嵌入式系统,嵌入到使用它的应用程序中
占用非常少,运行高效可靠,可移植性好
提供了零配置(zero-configuration)运行模式
SQLite数据库不仅提高了运行效率,而且屏蔽了数据库使
用和管理的复杂性,程序仅需要进行最基本的数据操作,
其他操作可以交给进程的数据库引擎完成
某著名企业
简单储存
SQLite数据库
SQLite数据库采用了模块化设计,由8个独立的模块构成,这些独立模
块又构成了三个主要的子系统,模块将复杂的查询过程分解为细小的
工作进行处理
某著名企业
简单储存
SQLite数据库
接口由SQLite C API组成,因此无论是应用程序、脚本,
还是库文件,最终都是通过接口与SQLite交互
编译器
由分词器和分析器组成
分词器和分析器对SQL语句进行语法检查,然后把SQL语
句转化为底层能更方便处理的分层的数据结构,这种分
层的数据结构称为“语法树”
把语法树传给代码生成器进行处理,生成一种针对
SQLite的汇编代码
最后由虚拟机执行
某著名企业
简单储存
SQLite数据库
虚拟机
SQLite数据库体系结构中最核心的部分是虚拟机,也称为
虚拟数据库引擎(Virtual Database Engine,VDBE)
与Java虚拟机相似,虚拟数据库引擎用来解释执行字节代
码
虚拟数据库引擎的字节代码由128个操作码构成,这些操
作码主要用以对数据库进行操作,每一条指令都可以完成
特定的数据库操作,或以特定的方式处理栈的内容
某著名企业
简单储存
SQLite数据库
后端
后端由B-树、页缓存和操作系统接口构成
B-树的主要功能就是索引,它维护着各个页面之间的复
杂的关系,便于快速找到所需数据
页缓存的主要作用就是通过操作系统接口在B-树和磁盘
之间传递页面
B-树和页缓存共同对数据进行管理
某著名企业
简单储存
SQLite数据库
SQLite数据库具有很强的移植性,可以运行在Windows,
Linux,BSD,Mac OS X和一些商用Unix系统,比如Sun的
Solaris,IBM的AIX
SQLite数据库也可以工作在入式操作系统下,例如QNX,
VxWorks,Palm OS,Symbin和Windows CE
SQLite的核心大约有3万行标准C代码,模块化的设计使这
些代码更加解
某著名企业
简单储存
数据库操作
可以查看SQLite的手册进行手工建库的操作。
在代码中动态建立数据库是比较常用的方法
在程序运行过程中,当需要进行数据库操作时,应用程序会
首先尝试打开数据库,此时如果数据库并不存在,程序则会
自动建立数据库,然后再打开数据库
在编程实现时,一般将所有对数据库的操作都封装在一个类
中,因此只要调用这个类,就可以完成对数据库的添加、更
新、删除和查询等操作
某著名企业
简单储存
数据库操作
下面内容是DBAdapter类的部分代码,封装了数据库的建立、
打开和关闭等操作
public class DBAdapter {
private static final String DB_NAME = "";
private static final String DB_TABLE = "peopleinfo";
private static final int DB_VERSION = 1;
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_AGE = "age";
public static final String KEY_HEIGHT = "height";
private SQLiteDatabase db;
private final Context context;
private DBOpenHelper dbOpenHelper;
某著名企业
简单储存
private static class DBOpenHelper extends SQLiteOpenHelper {
public DBAdapter(Context _context) {
context = _context;
}
public void open() throws SQLiteException {
dbOpenHelper = new
DBOpenHelper(context, DB_NAME, null, DB_VERSION);
try {
db = ();
}catch (SQLiteException ex) {
db = ();
}
}
public void close() {
if (db != null){
();
db = null;
}
}
}
某著名企业
简单储存
数据库操作
数据操作是指对数据的添加、删除、查找和更新的操作
通过执行SQL命名完成数据操作,但推荐使用Android提供的专
用类和方法,这些类和方法更加简洁、
为了使DBAdapter类支持对数据的添加、删除、更新和查找等功
能,在DBAdapter类中增加下面的这些函数
insert(People people)用来添加一条数
queryAllData()用来获取全部数据
queryOneData(long id)根据id获取一条数据
deleteAllData()用来删除全部数据
deleteOneData(long id)根据id删除一条数据
updateOneData(long id , People people)根据id更新一条
数据
某著名企业
总结
文件存储的几种方式
SharedPreferences用法
文件存储的用法
SQLite的用法
某著名企业
布置作业
课后作业
– 必做
• 学习使用SharedPreferences并做一个Demo。
• 使用文件读取解析XML方式实现上面一个例子。
• 使用SQLite实现上面一个例子。
– 选做
– 提交时间:当节课程
– 提交形验收
预习作业
– 网络编程