数据持久化:一种机制,是内存数据模型和存储数据模型的相互转化。
Android中的瞬时数据:存储在内存中,有可能会因为程序关闭或其它原因导致内存被回收而丢失的数据。
Android中常用的持久化技术
1.文件存储
文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件中的,因而它比较适合用于存储一些简单的文本数据或二进制数据
1.1存
Context类中提供了一个openFileOutput()方法,用于将数据存储到指定文件中。
可以看到有两个参数,String name和int mode
其中String name即文件名,要存储数据的文件的名字,PS:只是名字,不是路径。因为所有文件都默认(/data/data/app_package/files/)存储到当前应用的目录下,其他应用是不可访问的,除非你给他权限。
第二个参数int mode 顾名思义,操作模式,即存储文件的方式。一共有4种模式。
- MODE_PRIVATE 默认的操作模式,私有,当前应用可见,文件名相同时覆盖原文件内容。
- MODE_APPEND 追加,当前应用可见,文件名相同时在原文件内容的基础上追加。
- MODE_WORLD_READABLE 可读,允许其他应用访问。(Andorid4.2已废除)
- 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种方法。
- Context类中的getSharedPerferences()方法。
类似于文件存储,也是两个参数,第一个参数指定文件名,第二个参数指定操作模式,值得注意的是,操作模式目前仅剩下MODE_PRIVATE / 0 可用,其他模式在Android4.2和Android6.0之后已被遗弃。 - Activity类中的getPerferences()方法。
同理,不过只有一个参数,操作模式,同样也是一种操作模式。
它会自动将当前活动的类名作为SharedPerferences的文件名,所以只需要一个参数。 - PreferenceManager类中的getDefaultSharedPreferences()方法。
一个静态方法,它接收一个Context参数,并自动使用当前程序的包名作前缀来命名SharedPerferences文件。
这里着重讲一下第三种方法,因为我们最常用的就是第三种方法。
第三种方法的实现步骤主要分为三步。
- 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
- 使用putString()向SharedPreferences.Editor对象中添加数据。
- 使用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演示-实现简易学生管理系统的增删改查
数据存储