当前位置:   article > 正文

数据存储方案(一) - 文件存储、SharedPreferences存储_(一)使用sharedpreferences进行数据存储,获取sp对象,根据key值获取存储数据,利

(一)使用sharedpreferences进行数据存储,获取sp对象,根据key值获取存储数据,利用s

目录

文件存储

保存数据

保存输入框中的数据

读取数据

SharedPreferences存储

获取SharedPreferences对象

使用SharedPreferences保存数据

读取SharedPreferences数据

SQLite数据库存储


文件存储

文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式 化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据

  • Context.openFileOutput(): 可以用于将数据存储到指定的文件中。 这个方法接收两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data//files/目录下的第二个参数是文件操作模式,主要两种模式可选,MODE_PRIVATE和MODE_APPEND。其中MODE_PRIVATE 是默认的操作模式,表示当指 定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而 MODE_APPEND表示如果该文件存在就往文件里面追加内容,不存在就创建新文件。

保存数据

一个简单的例子存储数据:

  1. package com.example.test;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import java.io.BufferedWriter;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.OutputStreamWriter;
  8. public class MainActivity extends AppCompatActivity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. save();
  14. }
  15. public void save() {
  16. String data = "Something need to be saved";
  17. FileOutputStream fileOutputStream = null;
  18. BufferedWriter bufferedWriter = null;
  19. try {
  20. //saveData为文件名, Mode_PRIVATE是默认的操作模式,即内容直接覆盖
  21. fileOutputStream = openFileOutput("savedData", MODE_PRIVATE);
  22. //将字节流转换为字符留,然后利用该字符流新建一个缓冲字符流
  23. bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
  24. //写入数据
  25. bufferedWriter.write(data);
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. } finally {
  29. //关闭资源
  30. try {
  31. if (null != bufferedWriter) {
  32. bufferedWriter.close();
  33. }
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. }

运行后结果如下,可见在android文件系统里已经保存了相应的数据:

保存输入框中的数据

Context 类中还提供了一个 openFileInput()方法,用于从文件中读取数据。这个方法要比 openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data//files/目录下去加载这个文件,并返回一个 FileInputStream 对象,得到了这个对象之后再通过 Java 流的方式就可以将数据读取出来了

activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4. <EditText
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content"
  7. android:id="@+id/input"
  8. android:hint="Input something here"
  9. />
  10. </LinearLayout>

MainActivity.java

  1. package com.example.test;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.widget.EditText;
  5. import java.io.BufferedWriter;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.OutputStreamWriter;
  9. public class MainActivity extends AppCompatActivity {
  10. private static final String TAG = "MainActivity";
  11. EditText editText;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. editText = (EditText) findViewById(R.id.input);
  17. }
  18. @Override
  19. protected void onDestroy() {
  20. super.onDestroy();
  21. // 活动销毁时保存数据
  22. String data = String.valueOf(editText.getText());
  23. save(data);
  24. }
  25. public void save(String data) {
  26. FileOutputStream fileOutputStream = null;
  27. BufferedWriter bufferedWriter = null;
  28. try {
  29. //saveData为文件名, Mode_PRIVATE是默认的操作模式,即内容直接覆盖
  30. fileOutputStream = openFileOutput("savedData", MODE_PRIVATE);
  31. //将字节流转换为字符留,然后利用该字符流新建一个缓冲字符流
  32. bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
  33. //写入数据
  34. bufferedWriter.write(data);
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. } finally {
  38. //关闭资源
  39. try {
  40. if (null != bufferedWriter) {
  41. bufferedWriter.close();
  42. }
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. }

读取数据

  1. package com.example.test;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.widget.EditText;
  5. import android.widget.Toast;
  6. import java.io.BufferedReader;
  7. import java.io.BufferedWriter;
  8. import java.io.FileInputStream;
  9. import java.io.FileOutputStream;
  10. import java.io.IOException;
  11. import java.io.InputStreamReader;
  12. import java.io.OutputStreamWriter;
  13. public class MainActivity extends AppCompatActivity {
  14. private EditText editText;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. editText = findViewById(R.id.input);
  20. String data = load(); //加载数据
  21. if (!data.isEmpty()) {
  22. editText.setText(data); //恢复数据
  23. editText.setSelection(data.length());
  24. Toast.makeText(this, "restored data successfully", Toast.LENGTH_LONG).show();
  25. }
  26. }
  27. @Override
  28. protected void onDestroy() {
  29. super.onDestroy();
  30. // 活动销毁时保存数据
  31. String data = String.valueOf(editText.getText());
  32. save(data);
  33. }
  34. //save data
  35. public void save(String data) {
  36. FileOutputStream fileOutputStream;
  37. BufferedWriter bufferedWriter = null;
  38. try {
  39. //saveData为文件名, Mode_PRIVATE是默认的操作模式,即内容直接覆盖
  40. fileOutputStream = openFileOutput("savedData", MODE_PRIVATE);
  41. //将字节流转换为字符留,然后利用该字符流新建一个缓冲字符流
  42. bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
  43. //写入数据
  44. bufferedWriter.write(data);
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. } finally {
  48. //关闭资源
  49. try {
  50. if (null != bufferedWriter) {
  51. bufferedWriter.close();
  52. }
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. //load data
  59. public String load() {
  60. FileInputStream fileInputStream;
  61. BufferedReader bufferedReader = null;
  62. StringBuilder data = new StringBuilder();
  63. try {
  64. fileInputStream = openFileInput("savedData");
  65. bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
  66. //每次读取一行
  67. String line;
  68. while (( line = bufferedReader.readLine()) != null) {
  69. data.append(line);
  70. }
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. } finally {
  74. if (bufferedReader != null) {
  75. try {
  76. bufferedReader.close();
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. }
  82. return data.toString();
  83. }
  84. }

文件存储所用到的核心技术就是Context类中提供的openFileInput()和openFileOutput()方法,之后就是利用各种IO流来进行读写操作。 不过,正如我前面所说,文件存储的方式并不适合用于保存一些较为复杂的结构型数据。

SharedPreferences存储


获取SharedPreferences对象

使用SharedPreferences来存储数据,首先需要获取到SharedPreferences对象。Android 中主要提供了三种方法用于得到 SharedPreferences 对象。

  1. Context 类中的 getSharedPreferences()方法
    此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指定文件不存在则会创建一个,SharedPreferences文件存放在/data/data//shared_prefs/目录。第二个用于指定操作模式,主要有两种模式,MODE_PRIVATE 和 MODE_MULTI_PROCESS。MODE_PRIVATE 是默认操作模式,和直接传入0效果相同,表示只有当前的应用程序才可以对这个 SharedPreferences文件进行读写。MODE_MULTI_PROCESS 则一般是用于会有多个进程中对同一个SharedPreferences文件进行读写的情况
  2. Activity 类中的 getPreferences()方法
    这个方法和 Context 中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences 的文 件名。
  3. PreferenceManager 类中的 getDefaultSharedPreferences()方法
    这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件

使用SharedPreferences保存数据

主要可以分为三步实现:

  1. 调用 SharedPreferences 对象的 edit()方法来获取一个 SharedPreferences.Editor 对象。
  2. 向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用 putBoolean 方法,添加一个字符串则使用 putString()方法,以此类推。
  3. 调用 commit()方法将添加的数据提交,从而完成数据存储操作。

下面看一个例子:

更改activity_main.xml,不做任何复杂的功能,只是简单地放置了一个按钮,用于将一些数据存储到 SharedPreferences 文件当中。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".MainActivity">
  8. <Button
  9. android:id="@+id/save_data"
  10. android:text="Save Data"
  11. android:textSize="40dp"
  12. android:textAllCaps="false"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_gravity="center"
  16. android:layout_marginTop="350dp"
  17. />
  18. </LinearLayout>

MainActivity.java 

  1. package com.example.sharedpreferencestest;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.SharedPreferences;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. public class MainActivity extends AppCompatActivity {
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. Button buttonSavedData = findViewById(R.id.save_data);
  13. buttonSavedData.setOnClickListener(new View.OnClickListener() {
  14. @Override
  15. public void onClick(View v) {
  16. SharedPreferences.Editor editor = getSharedPreferences("savedData",
  17. MODE_PRIVATE).edit();
  18. //添加一些数据(键值对的形式)
  19. editor.putString("name", "zhoufuming");
  20. editor.putInt("age", 25);
  21. editor.putBoolean("married", false);
  22. //提交数据
  23. editor.commit();
  24. }
  25. });
  26. }
  27. }

运行代码,界面显示如下: 

点击Save Data按钮后,查看系统内部,出现了文件savedData.xml文件,内容也正是所输入的。

读取SharedPreferences数据

SharedPreferences 对象中提供了一系列的get方法用于对存储的数据进行读取,每种get方法都对应了SharedPreferences. Editor中的一种 put 方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个字符串就使用 getString()方法。这些getXXX方法都接收两个参数,第一个参数是键,传入存储数据 时使用的键就可以得到相应的值了,第二个参数是默认值,即表示当传入的键找不到对应的值时,会以什么样的默认值进行返回。

在 SharedPreferencesTest 项目的基础上修改 activity_main.xml 中的代码,增加了一个读取数据的按钮,如下所示:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="horizontal"
  7. tools:context=".MainActivity">
  8. <Button
  9. android:id="@+id/save_data"
  10. android:text="Save Data"
  11. android:textSize="20dp"
  12. android:textAllCaps="false"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_marginLeft="20dp"
  16. />
  17. <Button
  18. android:id="@+id/read_data"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_marginLeft="60dp"
  22. android:text="Read Data"
  23. android:textAllCaps="false"
  24. android:textSize="20dp"
  25. />
  26. </LinearLayout>

 布局如下图所示:

 然后更改MainActivity.java中的代码,如下所示:

 运行程序,然后点击Read_Data的按钮,可以观察到打印如下: 

SQLite数据库存储

SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID 事务,所以只要你以前使用过其他的 关系型数据库,就可以很快地上手 SQLite。文件存储和SharedPreferences存储只适用于去保存一些简单的数据和键值对,SQLite用于需要存储大量复杂的关系型数据的时候。

运用SQLite保存数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/765841
推荐阅读
相关标签
  

闽ICP备14008679号