Android系统中主要提供了三种方式用于简单的实现数据持久化功能:
文件存储(手机自带的内存)、SharedPreferences存储以及数据库存储
当然还可以用sd卡存储
读入写出
下面是疯狂java讲义中的关于IO流的一些补充,回忆一下
1,文件存储
手机自带的内存,只能供当前应用程序访问,其他应用程序访问不了,程序卸载这些数据也会随着消失
原理:
基本是先获取一个文件的输出流,然后把信息write进去,最后关闭流
a,通过上下文类
context的openFileOutput()方法获得一个FileOutputStream输出流
b,要写入的内容通过write()写到FileOutputStream对象
c,关闭流
openFileOutput()可以将数据存储到指定的文件中,方法有两个参数,第一个参数是文件名,不需要带上完整的路径,因为这里都是默认存储到data/data/file下面的
第二个参数是文件的操作模式,两种:MODE_PRIVATE和MODE_APPEND.前者是覆盖,后者是追加
(MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,前者是允许只读,后者是只写,但是都被抛弃,因为不安全)
private void save(String inputText ) {
FileOutputStream fos = null;
BufferedWriter writer = null;
try {
fos = openFileOutput( "data", Context.MODE_PRIVATE);
writer = new BufferedWriter( new OutputStreamWriter(fos));
writer.write( inputText);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if( writer != null)
writer.close();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
主要的就是上面的三句话
openFileOutput打开一个输出流,然后构建一个字节缓冲流对象然后写数据,
此外还有几个方法需要特别注意一下 ,这几个方法对于文件关系提供了更好的支持,配合上面介绍的方式, 就可以对文件的数据进行常规的CRUD操作 (增删改查),方法如下:
File getFIlesDir ():获取文件系统的绝对路径。
boolean
deleteFile(String name):删除一个指定文件名为name的文件。
String[] fileList() :当前应用内部存储路径下的所有文件名。
上一节中的保存数据到手机内存也有一些方法
//帮助我们返回一个目录
//context.getCacheDir ()的话就是保存到cache缓存文件夹下面
File file=new File(context.getFilesDir(), "userinfo.txt");
FileOutputStream fos= new FileOutputStream( file);
//zhangsan 123
fos.write(( username+ "##"+ password).getBytes());
fos.close();
也是可以保存数据的
---------------------
来看看读数据
读数据也是主要是用到一个打开输入的函数
openFileInput
private void read( ) {
FileInputStream fis= null;
BufferedReader reader = null;
StringBuilder sb=new StringBuilder();
try {
fis= openFileInput( "data");
reader= new BufferedReader( new InputStreamWriter(fis));
String line="";
while((line=reader.readerLine())!=null){
sb.append(line)
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if( reader!= null)
reader.close();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
主界面中
String inputText = load();
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded",
Toast.LENGTH_SHORT).show();
}
setSelection()方法将输入光标移动到文本的末尾位置以便再次输入
TextUtils.isEmpty()方法可以一次性进行两种空值的判断,当传入的字符串为空或者是null的时候都会返回true
总的来说文件存储不适合用于保存复杂的数据
------------------------------------------------------------------------------------------------------------------------
2,SharedPreferences存储
首先来看存储数据
SharedPreferences存储是利用键值对的方式来存储的,感觉有点类似map集合
要使用该方法来存储数据就要先
获得一个SharedPreferences对象,有三种获取方法
a,Context上下文类中的getSharedPreferences
两个参数,第一个是指定文件的名称,不在就创建。目录也是在data/data/包名/shared_prefs目录下
第二个参数是操作模式。MODE_PRIVATE是默认的,只允许当前的应用程序对其进行操作,MODE_MULTI_PROCESS是一般用于有多个进程中对同一个SharedPreferences文件进行读写的情况,同样有MODE_WORLD_WRITEABLE MODE_WORLD_READABLE两个被废弃的模式
b,Activity类中的getPreferences
只有一个参数,也是操作模式,文件的名称是默认的当前活动的类名
c,PreferenceManager管理类中的getDefaultSharedPreferences()
管理类中的一个静态方法,接收一个context参数,自动把当前的包名作为文件命名的前缀
得到一个对象之后,有三步来进行数据的存储
1,调用对象的edit方法获得一个SharedPreferences.Editor对象
2,向.Editor对象添加数据,putBoolean()或者是putString(),,等等putXXX()方法
3,调用commit方法将添加的数据提交,完成数据的存储操作
看一个实例:
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SharedPreferences.Editor editor=getSharedPreferences( "data", MODE_PRIVATE).edit();
editor.putString( "name", "hl174");
editor.putInt( "a