Android之数据存储详解(一)之文件存储和SharedPreferences存储

本博文是《第一行代码 Android》的读书笔记摘录。

数据存储被广泛应用在Android中,这里主要介绍Android中实现数据存储的5种方式,分别是:

1 、文件存储数据

2 、使用SharedPreferences存储数据

3、 SQLite数据库存储数据

4 、网络存储数据

5、使用ContentProvider存储数据

这几种方式各自有各自的优点和缺点,要根据不同的实际情况来选择,下面就各种方式进行详细介绍。

一、文件存储数据

文件存储是Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。如果你想使用文件存储的方式来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,这样方便于之后将数据从文件中重新解析出来。
那么首先我们就来看一看,Android 中是如何通过文件来保存数据的。

1、将数据存储到文件中

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

   public FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException

这个方法接收两个参数:
(1)第一个参数是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<packagename>/files/ 目录下的。

(2)第二个参数是文件的操作模式, 主要有两种模式可选,MODE_PRIVATE 和MODE_APPEND。
①MODE_PRIVATE 是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容;
②MODE_APPEND 则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。

openFileOutput ()方法返回的是一个FileOutputStream 对象,得到了这个对象之后就可以使用Java 流的方式将数据写入到文件中了。

范例:将一段文本保存到文件中

    public void save(String data) {
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", 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) {
                e.printStackTrace();
            }
        }
    }

如果你已经比较熟悉Java 流了, 理解上面的代码一定轻而易举吧。这里通过openFileOutput() 方法能够得到一个FileOutputStream 对象, 然后再借助它构建出一个OutputStreamWriter 对象,接着再使用OutputStreamWriter 构建出一个BufferedWriter 对象,这样你就可以通过BufferedWriter 来将文本内容写入到文件中了。

2、从文件中读取数据

类似于将数据存储到文件中,Context 类中还提供了一个openFileInput()方法,用于从文件中读取数据:

    public FileInputStream openFileInput(String name) throws FileNotFoundException 

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

范例:从文件中读取文本数据

public String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput("data");
            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();
    }

在这段代码中,首先通过openFileInput()方法获取到了一个FileInputStream 对象,然后借助它又构建出了一个InputStreamReader 对象,接着再使用InputStreamReader 构建出一个BufferedReader 对象,这样我们就可以通过BufferedReader 进行一行行地读取,把文件中所有的文本内容全部读取出来并存放在一个StringBuilder 对象中,最后将读取到的内容返回就可以了。

3、小结

文件存储其实所用到的核心技术就是Context类中提供的openFileInput()和openFileOutput()方法,之后就是利用Java 的各种流来进行读写操作就可以了。

不过,文件存储的方式并不适合用于保存一些较为复杂的文本数据,因此,下面我们就来学习一下Android 中另一种数据持久化的方式,它比文件存储更加简单易用,而且可以很方便地对某一指定的数据进行读写操作。

二、使用SharedPreferences存储数据

不同于文件的存储方式,SharedPreferences 是使用键值对的方式来存储数据的。也就是说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences 还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串,读取出来的数据仍然是字符串。

1、将数据存储到SharedPreferences 中

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

(1)Context 类中的getSharedPreferences()方法

    public abstract SharedPreferences getSharedPreferences(String name, int mode);

此方法接收两个参数:
(1)第一个参数用于指定SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences 文件都是存放在/data/data/<packagename>/shared_prefs/目录下的。

(2)第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATE 和MODE_APPEND。

①MODE_PRIVATE 仍然是默认的操作模式, 和直接传入0 效果是相同的, 表示只有当前的应用程序才可以对这个SharedPreferences 文件进行读写;

②MODE_APPEND则表示对在存在内容的基础上进行追加。

实例:

    SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
    editor.putString("name", "Tom");
    editor.putInt("age", 28);
    editor.putBoolean("married", false);
    editor.commit();

通过getSharedPreferences()方法指定SharedPreferences的文件名为data,并得到了SharedPreferences.Editor对象。接着向这个对象中添加了三条不同类型的数据,最后调用commit()方法进行提交,从而完成了数据存储的操作。

(2)Activity 类中的getPreferences()方法

public SharedPreferences getPreferences(int mode)

这个方法和Context 中的getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。

(3)PreferenceManager 类中的getDefaultSharedPreferences()方法

 public static SharedPreferences getDefaultSharedPreferences(Context context)

这是一个静态方法,它接收一个Context 参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences 文件。得到了SharedPreferences 对象之后,就可以开始向SharedPreferences 文件中存储数据了,主要可以分为三步实现。

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

2、从SharedPreferences 中读取数据

你应该已经感觉到了,使用SharedPreferences 来存储数据是非常简单的,不过下面还有更好的消息,其实从SharedPreferences 文件中读取数据更加的简单。

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

实例:

    SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
    String name = pref.getString("name", "");
    int age = pref.getInt("age", 0);
    boolean married = pref.getBoolean("married", false);

首先通过getSharedPreferences()方法得到了SharedPreferences 对象,然后分别调用它的getString()、getInt()和getBoolean()方法去获取前面所存储的姓名、年龄和是否已婚,如果没有找到相应的值就会使用方法中传入的默认值来代替。

未完待续。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值