标签:
数据存储在Android开发中是很重要的,因为做一个项目一定会用到数据存储,比如游戏或者应用的一些设置配置,游戏存档,应用使用习惯等。这篇主要写本地文件的存储,下篇会介绍数据库相关内容。
这里首先讲Android的存储结构,存储空间
android设备有两个存储空间:
RAM内存:运行内存,相当于电脑的内存
ROM内存:存储内存,相当于电脑的硬盘
SD卡:相当于电脑的移动硬盘,可有可无
现在的手机很多不支持sd卡,但是是有外部存储空间的。比如手机内存32G,其实是指外部空间。而ROM多大。手机厂商一般不会告诉你。对于普通用户,是不知道的,而我们程序员可以获取。
我们读写文件可以在内部存储或外部存储。
1、在内部存储中写文件
eg.保存用户名密码,勾选记住用户名,首次登陆把用户名保存到本地
布局文件就是两个ExitText,一个CheckBox和一个Button。(这里CheckBox应该加一个 android:layout_centerVertical=”true” 在父元素中垂直居中)
在java中存储文件的步骤是这样的:
File file = new File(“D:/info.txt”);
FileOutputStream fos = new FileOutputStream(file);
fos.write(buffer);
在android中也是这么简单:首先我们看android的存储目录结构File Explorer(找不到,可以在这里找Window——Show View——Other——File Explorer )
我们应用程序数据存储在内部存储空间的路径“data-data-项目包名”下。所以我们把上边语句改改,完整写法是这样的:
String name = et_name.getText().toString();
String pass = et_pass.getText(0.toString();
CheckBox cb = (CheckBox) findViewById(R.id.cb);
if(cb.isChecked()){
File file = new File(“data/data/com.live.rwinrom/info.txt”);
FileOutputStream fos = new FileOutputStream(file);
try{
fos.write((name + “##” + pass).getBytes());//##是为了拆分用户名和密码。这里正式开发中不是这样做
fos.close();//关流。
}catch(Exception e) {
e.printStackTrace();
}
我们点登录按钮的时候执行上边代码,就可在内部存储空间中生成info.txt文件。
2、在内部存储中读文件
getCacheDir()得到的file对象的路径是data/data/com.live.rwinrom/cache
系统管理应用界面的清除缓存,会清除cache文件夹下的东西,清除数据,会清除整个包名目录下的东西
4、在外部存储读写文件
storage/sdcard:4.3之后的sd卡路径
最简单的打开sd卡的方式
File file = new File("sdcard/info.txt");//谷歌为了兼容低版本,在存储空间中建了一个sdcard文件快捷方式指向storage/sdcard
写sd卡需要权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
读sd卡,在4.0之前不需要权限,4.0之后可以设置为需要
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
使用api获得sd卡的真实路径,部分手机品牌会更改sd卡的路径
Environment.getExternalStorageDirectory()
判断sd卡是否准备就绪
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
5、文件访问权限
6、用SharedPreference存储账号密码
往SharedPreference里写数据
//拿到一个SharedPreference对象
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
//拿到编辑器
Editor ed = sp.edit();
//写数据
ed.putString("name", name);
ed.commit();
从SharedPreference里取数据
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
//从SharedPreference里取数据
String name = sp.getBoolean("name", "");
7、生成xml文件
上边几个存储的方式不够满足我们的需求,比如我们要备份短信。每条短信,最少包含四个数据:address发送者电话号,body短信内容,date时间,type信息类型(收到的还是发出的)。
* 首先建一个Message对象
public class Message {
private String body;
private String date;
private String address;
private String type;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Message(String body, String date, String address, String type) {
super();
this.body = body;
this.date = date;
this.address = address;
this.type = type;
}
}
创建几个虚拟的短信对象,存在list中,并备份数据通常都是备份至sd卡,使用StringBuffer拼接字符串,把整个xml文件所有节点append到sb对象里
public class MainActivity extends Activity {
List smsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//虚拟10条短信
smsList = new ArrayList<Message>();
for(int i = 0; i < 10; i++){
Message sms = new Message("李伟好棒" + i, System.currentTimeMillis() + "", "138"+i+i, "1");
smsList.add(sms);
}
}
public void click(View v){
//在内存中把xml备份短信的格式拼接出来
StringBuffer sb = new StringBuffer();
sb.append(“
InputStream is = getClassLoader().getResourceAsStream("weather.xml");
XmlPullParser xp = Xml.newPullParser();
拿到指针所在当前节点的事件类型
int type = xp.getEventType();
事件类型主要有五种
如果获取到的事件类型不是END_DOCUMENT,就说明解析还没有完成,如果是,解析完成,while循环结束
while(type != XmlPullParser.END_DOCUMENT)
当我们解析到不同节点时,需要进行不同的操作,所以判断一下当前节点的name
当解析到name开始节点时,获取下一个节点的文本内容,temp、pm也是一样
case XmlPullParser.START_TAG:
//获取当前节点的名字
if("weather".equals(xp.getName())){
citys = new ArrayList<City>();
}
else if("city".equals(xp.getName())){
city = new City();
}
else if("name".equals(xp.getName())){
//获取当前节点的下一个节点的文本
String name = xp.nextText();
city.setName(name);
}
else if("temp".equals(xp.getName())){
String temp = xp.nextText();
city.setTemp(temp);
}
else if("pm".equals(xp.getName())){
String pm = xp.nextText();
city.setPm(pm);
}
break;
当解析到city的结束节点时,说明city的三个子节点已经全部解析完了,把city对象添加至list
case XmlPullParser.END_TAG:
if("city".equals(xp.getName())){
citys.add(city);
}
结尾发福利:
快捷键Ctrl + 1,如图设置Convert local variable to field,局部变量直接设成全局变量。
标签:
原文地址:http://blog.csdn.net/u013475983/article/details/51888228