引言:
在我们每天使用的手机设备中,无时无刻都在进行着数据的存和取。安卓作为一种手机操作系统,提供了如下方式的数据存取方式:Preference,File,Sqlite和网络,可以根据程序的实际需求选择合适的存取方式。
1、Preference
使用Preference方式来存取数据,用到了SharedPreferences接口和SharedPreferences.Editor,这连个接口在android.content中。下面以一个例子说明这两个接口的使用。我们经常会有这样的经历,正发短信了别人来了个电话,接了个电话,返回发信息窗口,前面编写的内容还在,本实例就模拟实现这个功能。
界面很简单,一个EditText,一个Button,详细代码如下:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/editTextMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine" />
<Button
android:id="@+id/buttonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editTextMsg"
android:layout_below="@+id/editTextMsg"
android:text="发送" />
</RelativeLayout>
下面看看Activity的代码:
package com.lzugis.preferenctest;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText editTextMsg;
private Button buttonSend;
//定义临时信息
private static final String Temp_Sms="Temp_Sms";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editTextMsg=(EditText)findViewById(R.id.editTextMsg);//实例化
buttonSend=(Button)findViewById(R.id.buttonSend);
SharedPreferences pre=getSharedPreferences(Temp_Sms,MODE_WORLD_READABLE);
String content=pre.getString("sms_content", "");
editTextMsg.setText(content);
buttonSend.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent itent=new Intent();
itent.setClass(MainActivity.this, RwActivity.class);
startActivity(itent);//启动另一个Activity
}
});
}
@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;
}
protected void onStop(){
super.onStop();
SharedPreferences.Editor editor=getSharedPreferences(Temp_Sms,MODE_WORLD_READABLE).edit();
editor.putString("sms_content",editTextMsg.getText().toString());
editor.commit();
};
}
说明:在OnStop方法中保存内容,使用getSharedPreferences().edit()方法获得SharedPreferences.Editor接口,调用getSharedPreferences().edit()的putstring()方法保存短信内容,调用commit提交内容。实现后结果如下图:
2、File 我们可以将一些数据直接以文件的形式保存在设备中,下面的例子分别举例说明了对文件的读取和从Sd卡中读写文件。Sd卡中操作,需要在AndroidManifest.xml文件中添加一下许可:
<!-- 在sd中创建和删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 向SD卡中的写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
界面设计的很简单,一个EditText用来输入内容,一个EditText用来读取内容,两个Button,分别响应对应的事件,代码如下:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".RwActivity" >
<EditText
android:id="@+id/editTextWrite"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:ems="10"
android:inputType="textMultiLine" />
<Button
android:id="@+id/buttonWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editTextWrite"
android:layout_below="@+id/editTextWrite"
android:text="Write" />
<EditText
android:id="@+id/EditTextRead"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonWrite"
android:layout_below="@+id/buttonWrite"
android:layout_marginTop="25dp"
android:ems="10"
android:inputType="textMultiLine" >
</EditText>
<Button
android:id="@+id/ButtonRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/EditTextRead"
android:layout_below="@+id/EditTextRead"
android:text="Read" />
</RelativeLayout>
2.1 读写文件方法
写文件方法:
/*
* 写文件方法
*/
private void write(String content)
{
try
{
FileOutputStream fos=openFileOutput(strFileName,MODE_APPEND);
//写内容
fos.write(content.getBytes());
//关闭文件流
fos.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
读文件方法:
/*
* 读文件方法
*/
private String read(){
try
{
//实例化文件输出流对象
FileInputStream fis=openFileInput(strFileName);
//定义缓存数组
byte[] buffer=new byte[fis.available()];
//读到缓冲区
fis.read(buffer);
return new String(buffer);
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
};
2.2 从Sd卡中读写文件
Sd卡写文件方法:
/*
* 写文件到Sd卡方法
*/
public void writeDataToSD(String strMsg)
{
try
{
// 获取File对象,确定数据文件的信息
File file = new File(Environment.getExternalStorageDirectory(),"f.txt");
//判断sd的外部设置状态是否可以读写
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
//流的对象
FileOutputStream fos = new FileOutputStream(file);
//将字符串转换成字节数组
byte[] buffer = strMsg.getBytes();
//开始写入数据
fos.write(buffer);
//关闭流的使用
fos.close();
Toast.makeText(RwActivity.this, "文件"+strMsg+"写入成功", 1000).show();
}
}
catch(Exception ex)
{
Toast.makeText(RwActivity.this, "文件写入失败", 1000).show();
}
}
SD卡读文件方法:
/*
* 从SD卡读文件方法
*/
public void readDataFromSD()
{
try
{
//创建File对象,确定需要读取文件的信息
File file = new File(Environment.getExternalStorageDirectory(),"f.txt");
//FileInputSteam 输入流的对象
FileInputStream fis = new FileInputStream(file);
//准备一个字节数组用户装即将读取的数据
byte[] buffer = new byte[fis.available()];
//开始进行文件的读取
fis.read(buffer);
//关闭流
fis.close();
//将字节数组转换成字符创, 并转换编码的格式
String strMsg = EncodingUtils.getString(buffer, "UTF-8");
edtRead.setText(strMsg);
Toast.makeText(RwActivity.this, "文件读取成功!", 1000).show();
}
catch(Exception ex)
{
Toast.makeText(RwActivity.this, "文件读取失败!", 1000).show();
}
}
Oncreate()方法源码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rw);
edtWrite=(EditText)findViewById(R.id.editTextWrite);
edtRead=(EditText)findViewById(R.id.EditTextRead);
btnWrite=(Button)findViewById(R.id.buttonWrite);
btnRead=(Button)findViewById(R.id.ButtonRead);
//写内容
btnWrite.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v)
{
// write(edtWrite.getText().toString());
// Toast.makeText(RwActivity.this, "文件写入成功", 1000).show();
writeDataToSD(edtWrite.getText().toString());
}
});
//读内容
btnRead.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v)
{
// edtRead.setText(read());
// Toast.makeText(RwActivity.this, "文件读取成功", 1000).show();
readDataFromSD();
}
});
}
完成后,软件的截图如下: