您的位置:首页 > 移动开发 > Android开发

Android_数据存储

2016-06-07 11:18 471 查看

Android_数据存储(文件存储)

Android中为开发者提供了三种数据持久化的方法:文件存储、SharedPreference存储、以及数据库存储。这篇Blog主要介绍的是文件存储和SharedPreference存储。

在开始之前,先来了解点东西,如果没有太大的兴趣可以直接跳到正文看。

瞬时数据? 瞬时数据就是那些存储在内容当中,有可能会因为程序关闭或其他原因导致内存被回收而丢弃的数据。Android中真是为了防止这种情况的出现才有了数据存储。

文件存储

文件存储比价适合用于存储一些简单的文本数据或二进制数据。

1、Context类提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。使用该方法需要两个参数:第一个: 文件名,在文件创建的时候使用的就是这个名称,这个文件名不包括路径。这个文件默认是存放在/data/data/packagename/files/目录下的(这个路径只是相对于虚拟机来说,如果你用的是真机,那就不一定。)第二个:

文件的操作模式,主要有两种模式可选:MODE_PRIVATE 是默认的操作模式,当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容MODE_APPEND 表示如果该文件已存在就往文件中追加内容,不存在就创建新文件。 其实还有两种模式:MODE_WORLD_READABLEMODE_WORLD_WRITEABLE 不过这两种已在Android4.2版本中被废弃了。

2、Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。该方法只接收一个参数,就是要读取的文件名,然后在系统自动到data/data/packagename/files/目录下去加载这个文件,并放回一个FileInputStream对象。

说了这么多,我们也该来真正的实战一下了:

我常见了一个项目,它的界面中有一个EditText控件,当我们输入完内容后,按Back键将退出这个程序,并将输入的内容保存到文件中,当我们再一次进入到这个程序的时候,我们要从文件中读取内容,并显示在界面上。

1、下面就来看一下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"
tools:context=".MainActivity" >
<EditText
android:id="@+id/main_et_Input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Input Something word" />
</LinearLayout>


2、我的MainActivity中的代码其实也比较简单,大家一看就明白了;

public class MainActivity extends Activity {
private EditText etInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
etInput=(EditText) findViewById(R.id.main_et_Input);
String returnString =load();
if (!TextUtils.isEmpty(returnString)) {
etInput.setText(returnString);
Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show();
}
}
/**
* 从文件中读取数据
*/
public String load(){
FileInputStream inputStream=null;
BufferedReader reader =null;
StringBuffer content =new StringBuffer();
try {
inputStream=openFileInput("data");
reader =new BufferedReader(new InputStreamReader(inputStream));
String line ="";
while ((line=reader.readLine())!=null) {
content.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (reader!=null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputString =etInput.getText().toString();
save(inputString);
}

/**
* 保存内容到文件中
* @param input 需要保存到文件中的数据
*/
public void save(String input){
FileOutputStream outputStream=null;
BufferedWriter bufferedWriter=null;
try {
outputStream = openFileOutput("data",Context.MODE_PRIVATE);
bufferedWriter =new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write(input);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedWriter!=null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}


在这里我有一个问题,希望看到我这篇Blog的大神们,能够帮我解答一下,小白感激不尽。问题就是,我用真机运行上面的代码的时候,如何才能看见data这个文件?换句话说就是,我如何才能在真机中访问到data/data/packagename/files/这个目录??

SharedPreferences存储

SharedPreference是使用键值对的方式来存储数据的。我们也可以通过通过键来获取到所对应的数值。SharedPreference还支持多种不同的数据存储。要想用SharedPreference存储数据,肯定要先获得SharedPreference的实例。Android中提供了三种获取该对象的实例:

1、Context类中的getSharedPreferences()方法

该方法接受两个参数,第一个参数: 指定SharedPreference文件的名称,如果指定的文件不存在则会创建一个,SharedPreference文件都是存放在/data/data/packagename/shared_prefs/目录下的。第二个参数: 指定操作模式,MODE_PRIVATE 是默认的操作模式,表示只有当前的应用程序才可以对这个SharedPreference文件进行读写。MODE_MULIT_PROCESS 一般用于对多个进程中对同一个SharedPreferences文件进行读写的情况。

2、Activity类中的getPreferences()方法

这个方法只接收一个操作模式的参数,使用这个方法会自动将当前活动的类名作为SharedPreference的文件名。

3、PreferenceManager类中的getDefaultSharedPreferences()方法

这个方法接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。

下面就让我们来小小的实践一下吧。

1、布局文件的代码:

<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"
android:orientation="vertical"
tools:context=".SharedPreferenceTest" >
<Button
android:id="@+id/btn_savaData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击保存数据" />
<Button
android:id="@+id/btn_restoreData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="恢复数据"
/>
</LinearLayout>


2、我的MainActivity中的代码如下:

public class SharedPreferenceTest extends Activity {
private Button btnSavaData,btnRestoreData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shared_preference_test);
btnSavaData=(Button) findViewById(R.id.btn_savaData);
btnRestoreData=(Button) findViewById(R.id.btn_restoreData);
btnSavaData.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Editor editor=
(getSharedPreferences("data", Context.MODE_PRIVATE))
.edit();
editor.putString("name", "Tome");
editor.putInt("age", 23);
editor.putBoolean("marry", false);
editor.commit();
}
});
btnRestoreData.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
SharedPreferences spf =getSharedPreferences
("data", Context.MODE_PRIVATE);
String name =spf.getString("name", "LiLi");
int age =spf.getInt("age", 0);
boolean marry =spf.getBoolean("marry", false);
Log.i("SharedPreference", "name:"+name);
Log.i("SharedPreference", "age:"+age);
Log.i("SharedPreference", "marry:"+marry);
}
});
}
}


3、当我点击保存数据的时候,大家可以看一下,我拿到的data.xml这个文件中的数据:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="marry" value="false" />
<string name="name">Tome</string>
<int name="age" value="23" />
</map>


4、当我点击恢复数据的按钮以后,看一下我打印的Log日志:

06-07 08:14:12.788: I/SharedPreference(1839): name:Tome
06-07 08:14:12.788: I/SharedPreference(1839): age:23
06-07 08:14:12.788: I/SharedPreference(1839): marry:false


这两种存储方法都比价简单,相信大家都已经掌握原理了,只是需要多加练习,你就是以后的大神。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: