瞬时数据:
指存储在内存当中,有可能因为程序关闭或其他原因导致内存回收而丢失的数据。
数据持久化:
指将那些内存中的瞬时数据保存在存储设备中,保证即时在手机或电脑关机时这些数据仍然不会丢失,数据持久化技术提供了一种机制让数据在瞬时状态和持久状态之间进行转换。
Android提供了文件存储、SharedPreferences存储以及数据库存储等方式来实现数据持久化功能。
文件存储
这是Android中最基本的一种数据存储方式,它不对存储的内容进行任何格式化处理,所有数据都原封不动的保存在文件中,比较适合存储简单的文本数据或二进制数据。
1)将数据存储到文件中
openFileOutput()方法:
Context类中的方法,用于将数据存储到指定文件。
第一个参数:文件名,该文件名不可包含路径,默认存储到/data/data/<packagename>/files/目录下。
第二个参数:文件的操作模式。MODE_PRIVATE为默认操作模式,表示当指定同样文件名时,所写入的内容会覆盖园文件中的内容;MODE_APPEND则表示该文件已经存在时,向文件里追加内容,不存在就创建文件。
1、修改activity_main.xml文件中代码,加入EditText用于输入文本。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Tpye Someting Here"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
}
//onDestroy()方法中获取输入内容,此时点击Back键系统会把输入内容保存在文件中
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
//储存内容到文件
private void save(String inputText) {
//Java输入输出流
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
//将数据内容写入到文件中
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if(writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
储存文件可以通过Android Device Monitor工具来查看,点击导航栏Tools→Android→Android Device Monitor打开该工具,进入File Explorer标签页可以找到名为data的文件。
注:Android7.0以上可能存在无法查看File Explorer中的内容的Bug。
2)从文件中读取数据
openFileInput()方法:
Context类中的方法,用于从文件中读取数据。
第一个参数:待读取的文件名,此时系统会自动加载/data/data/<packagename>/files/目录下的这个文件。
1、修改1)中MainActivity中的代码,使得重新启动的程序中能够保留上次输入的内容。
public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
String inputText = load();
if(!TextUtils.isEmpty(inputText)){
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this,"Restore Succeeded",Toast.LENGTH_SHORT).show();
}
}
//读取文件中储存的内容
private String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
//获取FileInputStream对象
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line="";
while((line=reader.readLine()) != null){
//把文件中所有文本内容读取出来,存放在StringBuilder中
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
finally {
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
private void save(String inputText) {
……
}
}
setSelection():
用于将输入光标移动至文本的末尾位置以便继续输入。
TextUtils.isEmpty():
用于一次性判断两种空值,当传入的字符串等于null或者等于空字符串时,返回true。
SharedPreferences存储
SharedPreferences是使用键值对key-value形式来存储数据,支持多种不同数据类型存储。
获取SharedPreferences对象的三种方式:
1、Context类中的getSharedPreferences()方法
第一个参数:用于指定SharedPreferences文件的名称,如果指定文件名不存在就会创建一个,该文件存放在/data/data/<packagename>/shared_prefs/目录下。
第二个参数:指定操作模式,目前只有一个Mode_PRIVATE模式可用,与直接传入0效果一致。
2、Activity类中的getPreferences()方法
只接受一个操作模式作为参数,该方法会自动将当前活动的类名作为SharedPreferences的文件名。
3、PreferencesManager类中的getDefaultSharedPreferences()方法
一个静态方法,它接受一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。
1)将数据存储到SharedPreferences中
一、调用SharedPreferences对象的edit()方法获取一个SharedPreferences.Editor对象。
二、向SharedPreferences.Editor对象添加数据,通过putXxx()方法添加。
三、调用apply()方法提交添加好的数据。
1、修改activity_main.xml文件中代码,添加一个Button点击储存数据到SharedPreferences文件中。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save Data"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button saveData = (Button) findViewById(R.id.save_data);
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences.Editor editor =
getSharedPreferences("data",MODE_PRIVATE).edit();
//添加数据
editor.putString("name","Tom");
editor.putInt("age",18);
editor.putBoolean("married",false);
//提交数据
editor.apply();
}
});
}
}
SharedPreferences文件是使用XML格式来对数据进行管理。
2)从SharedPreferences中读取数据。
SharedPreferences对象中提供一系列getXxx()方法,用于对储存的数据进行提取。
1、修改activity_main.xml中代码,添加恢复数据的Button,点击按钮从SharedPreferences中读取数据。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save Data"/>
<Button
android:id="@+id/restore_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Restore Data"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
……
Button restoreData = (Button) findViewById(R.id.restore_data);
restoreData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
//get()方法读取数据
String name = pref.getString("name","");
int age = pref.getInt("age",0);
boolean married = pref.getBoolean("married",false);
Log.d(TAG, "name is " + name);
Log.d(TAG, "age is " + age);
Log.d(TAG, "married is " + married);
}
});
}
}