数据持久化就是将内存中的顺时数据保存在存储设备中
6.2 文件存储
6.2.1 将数据存储到文件中
新建一个FilePersistenceTest项目,并修改activity_main.xml文件代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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="Trpe something here"/>
</LinearLayout>
此时输入的内容在按下Back键之后就会丢失,是瞬时数据,我们要做的就是将这些数据存储在文件中
修改MainAcitivity中的代码
package com.example.filepersistencetest;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.EditText;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class MainActivity extends Activity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
}catch(IOException ex){
ex.printStackTrace();
}
}
}
}
此时打开ADT在输入框中随便输入字符,按BACK键退出,可以借助DDMS的FileExplorer查看,发现在/data/data/com.example.filepersistencetest/files目录下生成了一个data文件 传输到电脑打开后发现就是我们之前输入的内容。
6.2.2 从文件中读取数据
修改MainActivity中代码如下
package com.example.filepersistencetest;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.Toast;
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 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)) {
//将文本内容填充到EditText里
edit.setText(inputText);
//将光标移到文本末尾位置
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded",
Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = " ";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
}
6.3 SharedPreferences存储
SharedPreferences是使用键对的方式来存储数据的。也就是说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。
这种方式要比文件存储方便的多
1.首先要获取到SharedPreferences对象,Android提供了三种方式来得到SharedPreferences对象
1.Context类中的getSharedPreferences()方法
2.Activity类中的getPreferences()方法
3.PrefernceManager类中的getDefaultSharedPreference()方法
得到了SharedPreferences对象以后就可以开始向SharedPrefernces中间中存储数据了,主要可以分为三步
1调用SharedPreferences对象的idit()方法来获取一个SharedPreferences.Editor对象。
2向SharedPreferences.Editor对象中添加数据
3.调用commit()方法将添加的数据提交
新建SharedPreferencesTest项目
activity_main.xml文件修改如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save data"/>
</LinearLayout>
简单的放置了一个按钮用于将数据存储到SharedPreferences文件当中。然后修改MainActivity中的代码
package com.example.sharedpreferencestest;
import android.app.Activity;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button saveData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData = (Button) findViewById(R.id.save_data);
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getSharedPreferences("data",
MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
}
});
}
}
同样的进入File Explorer中的/data/data/com.example.sharedpreferencestest/shared_prefs/目录下 可以找到data.xml 其内容是
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">Tom</string>
<boolean name="married" value="false" />
<int name="age" value="28" />
</map>
那么下一步我们就该看看我们如何从SharedPreferences文件中读取这些数据
6.3.2 从SharedPreferences中读取数据
SharedPreferences提供一系列get()方法对应不同数据类型的数据
修改activity_main.xml中的代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save data"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/restore_data"
android:text="Restore data"/>
</LinearLayout>
这里增加了一个还原数据的按钮,我们希望通过单击这个按钮来从SharedPreferences文件中读取数据,修改MAinActivity中的代码,如下:
package com.example.sharedpreferencestest;
import android.app.Activity;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button saveData;
private Button restoreData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData = (Button) findViewById(R.id.save_data);
restoreData = (Button)findViewById(R.id.restore_data);
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getSharedPreferences("data",
MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
}
});
restoreData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences pref = getSharedPreferences("data",
MODE_PRIVATE);
String name = pref.getString("name", " ");
int age = pref.getInt("age", 0);
boolean married = pref.getBoolean("married", false);
Log.d("MainActivity", "Name is " +name);
Log.d("MainActivity", "age is " +age);
Log.d("MainActivity", "married is " +married);
}
});
}
}
运行之后点击Restoredata,可以看到LOGCAT中的结果