数据存储全方案--持久化技术
在任何一个程序中,都需要不停的与数据打交道,没有数据的应用程序就是一个空壳子。多数的数据都是由用户产生的。
Andoird中提供了有3种主要的实现持久化的功能,分别是:1.文件存储2.SharedPreferences存储3.数据库存储。
除了这三种以外还有可以将数据存储在手机的SD卡中,不过使用上述三种方法保存数据会相对简单也相对安全一些。
那么下面就对3种方法做一个详细的讲解:
1.文件存储:
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中,这个方法接受两个参数,第一个参数是文件名,第二个参数是文件的操作模式,
主要有两种模式①MODE_PRIVATE是默认的操作模式,表示指定同样的文件名的时候,所写入的内容将会覆盖原文中的内容。②MODE_APPEND表示如果该文件已经存
在,就在文件中追加内容,如果不存在则创建新文件。
①将数据存储到文件中的方法:
通过openFileOutput()方法得到FileOutputStream对象,再借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,
这样就可以通过BufferedWriter来将文本内容写入到文件中代码如下:
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);
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
private 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 e){
e.printStackTrace();
}finally {
try {
if (writer!=null){
writer.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
②从文件中读取数据的方法:Context类中提供了一个openFileInput()方法,用于从文件中读取数据,它只接受一个参数,就是要读取的文件名。
然后系统会自动从/data/data/<package name>/files/目录中加载这个文件,并返回一个FileInputStream对象,则可以通过①中所述将文件读取出来。
下面代码是根据上面①所述的将①中所输入的代码保存下来。
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设置输入光标移动到文本的末尾位置
edit.setSelection(inputText.length());
Toast.makeText(this, "数据恢复成功", Toast.LENGTH_SHORT).show();
}
}
private 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();
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
private 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 e){
e.printStackTrace();
}finally {
try {
if (writer!=null){
writer.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
2.SharedPreferences存储
主要有以下三个方法用于得到SharedPreferences对象:
①Context类中的getSharedPreferences()方法。
这个方法接受两个参数,第一个参数用于指定SharedPreferences文件名,如果指定的文件名不存在会创建一个。
第二个参数是用于指定操作模式,目前是只有MODE_PRIVATE这一模式可选。
②Activity类中的getPreferences()方法。
这个方法和①类似,不过他只接受一个参数,因为使用这种方法的话会自动将当前活动的类名作为SharedPreferences文件名。
③PreferenceManager类中的getDefaultSharedPreferences()方法。
这是一个静态的方法,它接受一个Context参数,并自动的使用当前应用的包名作为前缀来命名SharedPreferences对象,得到SharedPreferences对象后有以下3步:
1.调用SharedPreferences对象的editor()方法来获取一个SharedPreferences.Editor对象。
2.向SharedPreferences.Editor对象中添加数据,比如添加一个字符串类型的数据使用putString()方法,以此类推。
3.调用apply()方法将添加的数据提交。
下面是一个例子:
public class MainActivity extends AppCompatActivity {
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 view) {
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married",false);
editor.apply();
}
});
restoreData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
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);
}
});
}
}