一、 Android数据存储
Android 系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、 SharedPreference 存储以及数据库存储。当然,除了这三种方式之外,你还可以将数据保存在手机的 SD 卡中。
二、 文件存储
文件存储不对存储的内容进行任何的格式化处理, 所有数据都是原封不动地保存到文件当中的, 因而它比较适合用于存储一些简单的文本数据或二进制数据。
1. 将数据存储到文件中
openFileOutput()方法,可以用于将数据存储到指定的文件中。接收两个参数:
第一个参数是文件名,所有的文件都是默认存储到/data/data/<packagename>/files/目录下的。
第二个参数是文件的操作模式,主 要 有 两 种 模 式 可 选 ,MODE_PRIVATE 和 MODE_APPEND。 其中 MODE_PRIVATE 是默认的操作模式, 表示当指定同样文件名的时候, 所写入的内容将会覆盖原文件中的内容, 而 MODE_APPEND 则表示如果该文件已存在就往文件里面追加内容,
不存在就创建新文件。
例子:
activity_main.xml中,在布局中加入了一个EditText,用于输入文本内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入"/>
</LinearLayout>
MainActivity中:
<span style="font-weight: normal;">package com.example.filepersistencetest;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
String inputText=edit.getText().toString();
save(inputText);
}
public void save(String inputText){
FileOutputStream out = null;
BufferedWriter writer = null;
try{
out=openFileOutput("data", Context.MODE_PRIVATE);
writer= new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(writer!=null){
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}</span>
首先我们在
onCreate()方法中获取了EditText的实例,
然后重写了onDestroy()方法, 这样就可以保证在活动销毁之前一定会调用这个方法。 在onDestroy()方法中我们获取了EditText中输入的内容,
并调用save()方法把输入的内容存储到文件中, 文件命名为data。
save()里通过openFileOutput()方法能够得到一个
FileOutputStream
对象,然后再借助它构建出一 个OutputStreamWriter对象,接着再使用
OutputStreamWriter
构建出一个 BufferedWriter
对象,这样你就可以通过BufferedWriter
来将文本内容写入到文件中了。
切换到DDMS视图,并点击FileExplorer切换卡
, 在 这 里 进 入 到 /data/data/com.example.filepersistencetest/files/目录下,可以看到生成了一个data文件。
2. 从文件中读取数据
openFileInput()方法, 用于从文件中读取数据。它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package
name>/files/目录下去加载这个文件,并返回一个FileInputStream对象。
例子:启动程序时
EditText中能够保留我们上次输入的内容。
<span style="font-weight: normal;"> protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit);
String inputText=load();
if(!TextUtils.isEmpty(inputText)){
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
}
}</span>
<span style="font-weight: normal;"> 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) {
// TODO: handle exception
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
return content.toString();
}</span>
在
onCreate()方法中调用
load()方法来读取文件中存储的文本内容, 如果读到的内容不为空, 就调用EditText
的
setText()方法将内容填充到EditText里,并调用setSelection
方法将输入光标移动到文本的末尾位置以便于继续输入,然后弹出一句还原成功的提示。
load()方法中
首先通过openFileInput()方法获取到了一个FileInputStream对象,然后借助它又构建出了一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,这样我们就可以通过BufferedReader进行一行行地读取,把文件中所有的文本内容全部读取出来并存放在一个
StringBuilder
对象中。
Android 系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、 SharedPreference 存储以及数据库存储。当然,除了这三种方式之外,你还可以将数据保存在手机的 SD 卡中。
二、 文件存储
文件存储不对存储的内容进行任何的格式化处理, 所有数据都是原封不动地保存到文件当中的, 因而它比较适合用于存储一些简单的文本数据或二进制数据。
1. 将数据存储到文件中openFileOutput()方法,可以用于将数据存储到指定的文件中。接收两个参数:
第二个参数是文件的操作模式,主 要 有 两 种 模 式 可 选 ,MODE_PRIVATE 和 MODE_APPEND。 其中 MODE_PRIVATE 是默认的操作模式, 表示当指定同样文件名的时候, 所写入的内容将会覆盖原文件中的内容, 而 MODE_APPEND 则表示如果该文件已存在就往文件里面追加内容, 不存在就创建新文件。
例子:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入"/>
</LinearLayout>
MainActivity中:<span style="font-weight: normal;">package com.example.filepersistencetest;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
String inputText=edit.getText().toString();
save(inputText);
}
public void save(String inputText){
FileOutputStream out = null;
BufferedWriter writer = null;
try{
out=openFileOutput("data", Context.MODE_PRIVATE);
writer= new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(writer!=null){
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}</span>
首先我们在
onCreate()方法中获取了EditText的实例,
然后重写了onDestroy()方法, 这样就可以保证在活动销毁之前一定会调用这个方法。 在onDestroy()方法中我们获取了EditText中输入的内容,
并调用save()方法把输入的内容存储到文件中, 文件命名为data。save()里通过openFileOutput()方法能够得到一个
FileOutputStream
对象,然后再借助它构建出一 个OutputStreamWriter对象,接着再使用
OutputStreamWriter
构建出一个 BufferedWriter
对象,这样你就可以通过BufferedWriter
来将文本内容写入到文件中了。
切换到DDMS视图,并点击FileExplorer切换卡
, 在 这 里 进 入 到 /data/data/com.example.filepersistencetest/files/目录下,可以看到生成了一个data文件。
2. 从文件中读取数据
openFileInput()方法, 用于从文件中读取数据。它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回一个FileInputStream对象。
例子:启动程序时 EditText中能够保留我们上次输入的内容。
openFileInput()方法, 用于从文件中读取数据。它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回一个FileInputStream对象。
例子:启动程序时 EditText中能够保留我们上次输入的内容。
<span style="font-weight: normal;"> protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit);
String inputText=load();
if(!TextUtils.isEmpty(inputText)){
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
}
}</span>
<span style="font-weight: normal;"> 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) {
// TODO: handle exception
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
return content.toString();
}</span>
在
onCreate()方法中调用
load()方法来读取文件中存储的文本内容, 如果读到的内容不为空, 就调用EditText
的
setText()方法将内容填充到EditText里,并调用setSelection
方法将输入光标移动到文本的末尾位置以便于继续输入,然后弹出一句还原成功的提示。 load()方法中
首先通过openFileInput()方法获取到了一个FileInputStream对象,然后借助它又构建出了一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,这样我们就可以通过BufferedReader进行一行行地读取,把文件中所有的文本内容全部读取出来并存放在一个 StringBuilder 对象中。
首先通过openFileInput()方法获取到了一个FileInputStream对象,然后借助它又构建出了一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,这样我们就可以通过BufferedReader进行一行行地读取,把文件中所有的文本内容全部读取出来并存放在一个 StringBuilder 对象中。