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

0 489

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

Android数据存储方式

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

1、文件存储

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

1.1 存储到手机内存中

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

1
2
3
4
  openFileOutput(name, mode):
  name:是文件名,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<package name="">/files/(等价于 getFilesDir())目 录下 的
  mode:是文件的操作模式 ,MODE_PRIVATE:默认的操作模式,同名文件内容会被覆盖。MODE_APPEND则表示 如果该文件已存在就往文件里面追加内容,不存在就创建新文件。
</package>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public 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清掉中添加所需权限

1
2
3
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission></uses-permission>

第 2 步:动态申请权限

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public 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目录下。

1
2
3
4
5
6
7
8
9
10
11
12
public 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存储在下一篇详细讲解

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章资源,如无特殊说明或标注,均为本站网友和创作者贡献分享。如若本站内容侵犯了原著者的合法权益,可联系网站客服QQ2743319061删除。

云炬星球 安卓教程 Android开发学习教程(30)- Android数据存储的几种方式 https://src.yunjunet.cn/876833.html

常见问题
  • 放心亲,我们不会为了几十块钱的东西坏了名声!
查看详情
  • 方法一:点击“立即下载.”按钮,付款后在下载弹窗的虚线框的隐藏信息里获取 方法二:在正文底部使用VIP查看隐藏的解压密码 方法三:联系【云炬网络】公众号客服获取
查看详情
  • 付款后会出现“立即下载”按钮(点击即可下载),如果下载失败也可以联系客服发订单截图补发。
查看详情
  • 登录购买会多端同步购买记录,永久可以查看反复下载;非登录购买仅将购买记录保存到本地浏览器中,浏览器cookie清除后无法再次下载。先右上角点登录,然后点击微信图标可以快速授权注册登录^_^
查看详情
  • 可以试看。点击”查看演示“或“试看预览”按钮可以试读从资料目录中节选的部分内容,也可以自己指定想试看的内容。
查看详情
  • 原因一:本站所有资源已开启有效性检测(服务器24h全自动监测),当监测到下载链接无法访问时会提示“该资源已失效,请勿购买”,遇到这种情况可以联系客服修复失效的下载链接,或直接联系客服在淘宝下单购买即可。(检测原理:购买前服务器程序会预访问下载链接,响应值为200说明资源有效允许购买,响应值为404或502等报错说明资源失效禁止购买)。原因二:上传者未启用“下载”选项。
查看详情
官方客服团队

为您解决烦忧 - 24小时在线 专业服务