原文链接:http://www.orlion.ga/578/
Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、SharedPreference存储以及数据库存储。当然,除了这三种方式之外,你还可以将数据保存在手机的 SD卡中,不过使用文件、SharedPreference或数据库来保存数据会相
对更简单一些,而且比起将数据保存在 SD卡中会更加的安全
一、文件存储
1、将数据存储到文件中
Context类中提供了一个 openFileOutput ()方法,可以用于将数据存储到指定的文件中。这个方法接收两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<packagename>/files/目录下的。第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和MODE_APPEND。其中 MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而 MODE_APPEND则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。其实文件的操作模式本来还有另外两种,MODE_WORLD_READABLE和 MODE_WORLD_WRITEABLE,这两种模式表示允许其他的应用程序对我们程序中的文件进行读写操作, 不过由于这两种模式过于危险,很容易引起应用的安全性漏洞,现已在 Android 4.2版本中被废弃
openFileOutput ()方法返回的是一个 FileOutputStream对象,得到了这个对象之后就可以使用 Java流的方式将数据写入到文件中了。如下是代码示例:
public void save() { String data = "Data to save"; 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(); } } }
2、从文件中读取数据
Context类还提供了一个openFileInput()方法用于从文件中读取数据。这个方法要比openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回一个FileInputStream对象。
代码示例:
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(); }
二、SharedPreferences存储
SharedPreferences是使用键值对的方式来存储数据的,SharedPreferences还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串,读取出来的数据仍然是字符串。
1、将数据存储到SharedPreferences中
要想使用SharedPreferences来存储数据,首先要获取到SharedPreferences对象。Android主要提供了三种方式获取SharedPreferences对象
- Context类中的getSharedPreferences()方法
此方法接收两个参数,第一参数用于指定SharedPreferences文件的名称,如果不存在则创建一个,SharedPreferences文件都是存放在/data/data/<packagename>/shared_prefs目录下。第二个参数用于指定操作模式,主要有两种模式,MODE_PRIVATE和MODE_MULTI_PROCESS。MODE_PRIVATE是默认的操作模式,和直接传入)效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。MODE_MULTI_PROCESS则一般是用于会有多个进程中对同一个SharedPreferences文件进行读写的情况。MODE_WORLD_READABLE和 MODE_WORLD_WRITEABLE这两种模式已在 Android 4.2版本中被废弃
- Activity类中的getPreferences()方法
这个方法和 Context中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences的文件名。
- PreferenceManager类中的getDefaultSharedPreferences()方法
这是一个静态方法,它接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件
得到了SharedPreferences对象后,就可以开始向SharedPreferences文件中存储数据了,主要有三步:
- 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
- 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔类型的数据就使用putBoolean()方法,添加字符串就使用putString()。
- 调用commint()方法将添加的数据提交,从而完成数据存储操作。
2、从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 sex = pref.getBoolean("sex", true); Log.d("SharedPreferences", name); Log.d("SharedPreferences", "age=" + age); Log.d("SharedPreferences", "sex=" + sex);