1. 数据持久化技术简介
- 什么是瞬时数据?
瞬时数据指的是那些存储在内存当中的数据,这些数据由于内存被回收或者程序被意外终止之后又可能丢失.
2.数据持久化技术的引入的必要性:
有一些关键性重要的数据,我们不希望由于内存的回收而丢失,这个时候就需要数据持久化技术.
数据持久化技术就是讲那些内存中的瞬时数据保存到存储设备中,保证即使在电脑或手机关机的情况下,
这些数据依然不会丢失.保存内存中的数据时处于瞬时状态的,而保存在存储设备中的数据是处于持久化状态的,持久化
技术提供了一种机制可以让数据在瞬时状态和持久化状态之间进行转换.
2.Android中的数据持久化技术
2.1 android中的三种简单的方式实现数据持久化技术的功能:
1> 文件存储
2> SharedPreferences 偏好设置
3> SQLite 数据库存储
当然除了这三种方式之外,你也可以讲数据存储到手机的sd卡当中,只不过使用文件,SharedPreferences或数据库来保存数据会
相对简单一些,而且比起将数据保存到sd卡中会更加的安全.
3. Android持久化技术之 文件存储
3.1 文件存储的特点:
它不对存储的内容进行任何的格式化处理,所有的数据都是原封不动地保存到文件当中的,因而它比较适合存储
一些简单的文本数据或二进制数据.如果你想要使用文件存储的方式保存一些较为复杂的文本数据,就需要定义
一套自己的格式规范,这样方便之后将数据从文件中重新解析出来.
3.2 将数据存储到文件当中
Context类提供了一个方法
openFileOutput(String name, int mode);
返回一个FileOutputStream ,第一个参数是文件名,在文件创建的时候使用的就是这个名称,这里的文件名不可以包含路径.
因为所有的文件都是默认存储到/data/data//files/ 目录下的.第二个参数是文件的操作模式,主要有两种
模式可以选择: MODE_PRIVATE和MODE_APPEND.其中MODE_PRIVATE是默认的操作模式,表示当指定的文件名称一样的时候
所写入的内容会覆盖掉原文件中的内容,而MODE_APPEND表示如果该文件已经存在就在文件的末尾追加,如果文件不存在就
重新创建.
openFileOutput()方法返回的是一个FileOutputStream 对象,拿到之后就可以使用javaIO流的操作方法对其进行操作了.
下面是一个例子,用于保存从一个输入框中获取数据.保存到文件当中.
首先是布局文件一个EditText,用于用户输入内容,一个Button,用于用户点击之后保存到文件当中.
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.my09_filepersistence.MainActivity"
tools:ignore="HardcodedText" >
<EditText
android:id="@+id/et_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:hint="请输入要保存的内容"
android:layout_marginTop="18dp"
>
</EditText>
<Button
android:id="@+id/btn_keep"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/et_content"
android:layout_marginTop="58dp"
android:onClick="doClick"
android:text="保存到文件当中" />
</RelativeLayout>
然后在MainActivity.java当中通过处理点击事件而保存用户输入的内容.
MainActivity.java
package com.example.my09_filepersistence;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity
{
private EditText etInput;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etInput = (EditText) findViewById(R.id.et_content);
}
public void doClick(View view)
{
switch(view.getId())
{
case R.id.btn_keep:
String text = etInput.getText().toString();
FileOutputStream fos = null;
BufferedWriter writer = null;
try
{
fos = openFileOutput("data", MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(fos));
writer.write(text);
} catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if(writer != null)
{
writer.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
break;
}
}
}
这样当我们点击保存的时候,就会在项目目录下发现一个data文件,打开之后就可以看到我们保存的内容.
3.3 从文件中读取数据
类似于将数据存储到文件当中,Context类中还提供了一个openFileInput(String name)方法,
该方法只接收一个参数,即要读取的文件名,然后系统会自动到/data/data//files/ 目录下去加载
这个文件,并返回一个FileInputStream对象,得到这个对象之后再通过Java流的方式就可以讲数据读取出来了.
下面是一个完整的Demo,把输入框中数据保存到文件当中,还有就是从文件当中读取数据显示到TextView当中.
package com.dream.fioman.fioman_filesave;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends Activity {
private EditText etInput;
private TextView tvShowContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etInput = (EditText) findViewById(R.id.editText);
tvShowContent = (TextView) findViewById(R.id.textView);
}
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1: //将输入的内容保存