Android开发学习教程(30)- Android数据存储的几种方式

101 阅读3分钟

—— 十七岁全力以赴,十八岁好好庆祝,Fighting!

Android数据存储方式

Android数据持久化存储共有四种方式,分别是文件存储、SharedPreferences、Sqlite数据库和ContentProvider。在本篇幅中只介绍前面三种存储方式,因为ContentProvider属于android四大组件之一,所以它的数据存储方式在介绍四大组件的时候说明。

1、文件存储

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

1.1 存储到手机内存中

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

1234  ``openFileOutput(name, mode):``  ``name:是文件名,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<``package name=``""``>/files/(等价于 getFilesDir())目 录下 的``  ``mode:是文件的操作模式 ,MODE_PRIVATE:默认的操作模式,同名文件内容会被覆盖。MODE_APPEND则表示 如果该文件已存在就往文件里面追加内容,不存在就创建新文件。``</``package``>
1234567891011121314151617181920212223242526272829303132333435363738394041424344public void save(String data) {``    ``FileOutputStream out = ``null``;``    ``BufferedWriter writer = ``null``;``    ``try {``        ``out = openFileOutput(``"content"``, Context.MODE_PRIVATE);``        ``writer = ``new BufferedWriter(``new OutputStreamWriter(out));``        ``writer.write(data);``    ``} ``catch (IOException e) {``        ``e.printStackTrace();``    ``} ``finally {``        ``try {``            ``if (writer != ``null``) {``                ``writer.close();``            ``}``        ``} ``catch (IOException e) {``        ``}``    ``}``}``public String read() {``    ``FileInputStream in = ``null``;``    ``BufferedReader reader = ``null``;``    ``StringBuilder content = ``new StringBuilder();``    ``try {``        ``in = openFileInput(``"content"``);``        ``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();``}

1.2 存储到手机SD卡中

前面说的存储到手机内存,数据是存储在应用程序内的,文件大小受到限制,而且数据随着程序的卸载而自动清除;当要存储大的文件时,或者想数据不会随着程序的卸载而自动清除就可以使用sd卡方式存储了。使用sd卡存储主要是使用Environment这个类的功能。

注:在Android6.0之后读写SD卡等危险的操作需要动态申请存储等权限。否则可能会报异常java.io.FileNotFoundException: /storage/emulated/0/test: open failed: EACCES (Permission denied)

第 1 步:在AndroidManifest清掉中添加所需权限

123    ``<uses-permission android:name=``"android.permission.READ_EXTERNAL_STORAGE"``>``    ``<uses-permission android:name=``"android.permission.WRITE_EXTERNAL_STORAGE"``>``</uses-permission></uses-permission>

第 2 步:动态申请权限

12requestPermissions(``new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, ``101``);

第 3 步:使用Environment获取SD目录,读写数据:

1234567891011121314151617181920212223242526272829303132333435363738public void save(String data) {``    ``try {``        ``// 获取SDcard路径``        ``File sdCardDir = Environment.getExternalStorageDirectory();``        ``// SDCard目录:/mnt/sdcard``        ``String sdcardPath = sdCardDir.getAbsolutePath();``        ``File file = ``new File(sdCardDir, ``"test"``);``        ``RandomAccessFile raf = ``new RandomAccessFile(file, ``"rw"``);``        ``// 将文件记录指针移动最后``        ``raf.seek(file.length());``        ``// 输出文件内容``        ``raf.write(data.getBytes());``        ``raf.close();``    ``} ``catch (Exception e) {``        ``e.printStackTrace();``    ``}``}``public String read() {``    ``StringBuilder sb = ``new StringBuilder();``    ``// 获取SDcard路径``    ``try {``        ``File sdCardDir = Environment.getExternalStorageDirectory();``        ``File file = ``new File(sdCardDir, ``"test"``);``        ``InputStream inputStream = ``new FileInputStream(file);``        ``int len = ``0``;``        ``byte``[] buffer = ``new byte``[``1024``];``        ``while ((len = inputStream.read(buffer)) != -``1``) {``            ``sb.append(``new String(buffer, ``0``, len));``        ``}``        ``// 关闭流``        ``inputStream.close();``    ``} ``catch (Exception e) {``        ``e.printStackTrace();``    ``}``    ``return sb.toString();``}

2、SharedPreferences存储

SharedPreferences类,它是一个轻量级的存储类,适合用于保存软件配置参数。SharedPreferences是使用键值对的方式来存储数据的,存储数据是以xml文件形式存储,文件存放在/data/data/your package name/shared_prefs目录下。

123456789101112public void save(String data) {``    ``SharedPreferences preferences = getSharedPreferences(``"test"``, MODE_APPEND);``    ``SharedPreferences.Editor editor = preferences.edit();``    ``editor.putString(``"content"``, data);``    ``editor.commit();``}``public String read() {``    ``SharedPreferences preferences = getSharedPreferences(``"test"``, MODE_PRIVATE);``    ``return preferences.getString(``"content"``, ``""``);``}

SQLite存储在下一篇详细讲解

**