当前位置: 代码迷 >> 综合 >> 数据存储Android中的数据持久化技术【文件存储/SharedPreferences/SQLite数据库】
  详细解决方案

数据存储Android中的数据持久化技术【文件存储/SharedPreferences/SQLite数据库】

热度:29   发布时间:2023-12-17 08:22:30.0

数据持久化:一种机制,是内存数据模型和存储数据模型的相互转化。

Android中的瞬时数据:存储在内存中,有可能会因为程序关闭或其它原因导致内存被回收而丢失的数据。

Android中常用的持久化技术


1.文件存储

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

1.1存

package  android.content -> Context -> public abstract FileOutputStream openFileOutput(String name, @FileMode int mode)

Context类中提供了一个openFileOutput()方法,用于将数据存储到指定文件中。

可以看到有两个参数,String name和int mode

其中String name即文件名,要存储数据的文件的名字,PS:只是名字,不是路径。因为所有文件都默认(/data/data/app_package/files/)存储到当前应用的目录下,其他应用是不可访问的,除非你给他权限。

第二个参数int mode 顾名思义,操作模式,即存储文件的方式。一共有4种模式。

  1. MODE_PRIVATE    默认的操作模式,私有,当前应用可见,文件名相同时覆盖原文件内容。
  2. MODE_APPEND    追加,当前应用可见,文件名相同时在原文件内容的基础上追加。
  3. MODE_WORLD_READABLE    可读,允许其他应用访问。(Andorid4.2已废除)
  4. MODE_WORLD_WRITEABLE    可写,允许其他应用修改。(Andorid4.2已废除)

openFileOutput()返回的是一个FileOutputStream对象,得到这个对象后使用Java流将数据写入文件。

1.2读

    package android.content->Context->public abstract FileInputStream openFileInput(String name)

同样Context类中也提供了一个openFileInput()方法,用于从文件中读取数据。

openFileInput只有一个参数,即要读取的文件名。

openFileInput()返回的是一个FileInputStream对象,得到这个对象就后使用Java流的将数据从文件中读取。

1.3demo演示-实现活动销毁时自动保存数据并在活动再次打开时读取数据。


布局就一个输入框

<EditText  android:id="@+id/edit"  android:hint="输入你要存的数据"  android:layout_width="match_parent"  android:layout_height="wrap_content" />

主要看Activity

public class MainActivity extends AppCompatActivity {EditText editText;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText = findViewById(R.id.edit);
// 在活动创建时调用将上次退出时保存的数据展示出来  read();}@Override
    protected void onDestroy() {super.onDestroy();
// onDestory是活动在被销毁之前调用的,这里在调用了write()实现了在销毁活动之前将数据保存到文件里。  write();}//存储  public void write() {
// 获取数据框的值  String data = editText.getText().toString();FileOutputStream out;BufferedWriter writer = null;try {
// openFileOutput方法用于将数据存储到文件中。这个方法接收两个参数,文件名和操作模式  out = openFileOutput("something", MODE_PRIVATE);writer = new BufferedWriter(new OutputStreamWriter(out));writer.write(data);} catch (Exception e) {e.printStackTrace();} finally {
// close也需要try-catch  try {if (writer != null) writer.close();} catch (IOException e) {e.printStackTrace();}}}// 读取  public void read() {FileInputStream input;BufferedReader reader = null;String data = "";try {input = openFileInput("something");reader = new BufferedReader(new InputStreamReader(input));// 这里读取一行。存入的时候一个回车算一行  data = reader.readLine();// 如果要读取多行请放开这部分代码 // 多行读取开始 // String line = ""; // while ((line = reader.readLine()) != null) { // data = data + "\n" + line; // } // 多行读取结束  // 把拿到的值放到输入框  editText.setText(data);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}
}

写的自认为比较详细,注意看注释,需要注意到的地方都带有注释。

2.SharedPreferences

    SharedPrefences使用键值对的方式存储数据,支持多种数据类型存储(存int取int,存String取String)。

    保存下来的文件是XML格式。

2.1存

获取SharedPerferences对象Android主要提供了3种方法。

  1. Context类中的getSharedPerferences()方法。
    类似于文件存储,也是两个参数,第一个参数指定文件名,第二个参数指定操作模式,值得注意的是,操作模式目前仅剩下MODE_PRIVATE / 0 可用,其他模式在Android4.2和Android6.0之后已被遗弃。
  2. Activity类中的getPerferences()方法。
    同理,不过只有一个参数,操作模式,同样也是一种操作模式。
    它会自动将当前活动的类名作为SharedPerferences的文件名,所以只需要一个参数。
  3. PreferenceManager类中的getDefaultSharedPreferences()方法。
    一个静态方法,它接收一个Context参数,并自动使用当前程序的包名作前缀来命名SharedPerferences文件。

这里着重讲一下第三种方法,因为我们最常用的就是第三种方法。

第三种方法的实现步骤主要分为三步。

  1. 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
  2. 使用putString()向SharedPreferences.Editor对象中添加数据。
  3. 使用applay()提交数据。

2.2读

SharedPreferences对象中提供了一系列的get方法,用于对存储的数据进行读取,每个get方法都对应了SharedPreferences.Editor中的一种put方法。

这些get方法都接收两个参数:存入的值的键,找不到这个值后使用的默认值。

2.3demo演示-实现记住密码和自动登陆。





3.SQLite数据库

    Android内置的轻量级关系型数据库,运算速度快,占用少,遵循ACID事务,支持标准SQL语法。

3.1创建数据库

Android专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以对数据库进行各种操作。

SQLiteOpenHelper是一个抽象类,所以需要自己谢一个DBHelper去继承SQLiteOpenHelper。

它提供了两个我们需要去重写的抽象方法onCreate()和onUpgrade()来实现创建库和升级库。

它还提供了两个实例方法getReadableDatabase()和getWritableDatabase()来创建或获取一个库。

3.2demo演示-实现简易学生管理系统的增删改查



数据存储

  相关解决方案