程序中很重要的一部分是数据的交换,而交换中很重要一点是如何实现数据的存储。根据数据的作用,选择不同的保存方式和使用权限。Android数据的存储有如下6种:
- 保存数据到应用 程序私有的文件夹下
- 保存到公共的sd卡上
- sharedpreferences保存
- 使用xml文件去保存
- 使用数据库保存
- 内容提供者(Content provider)
一、保存数据到应用 程序私有的文件夹下
路径写this.getFilesDir();对应/data/data/com.sky.qqlogin/files
this.getCacheDir(); 对应/data/data/com.sky.qqlogin/cache
- 存数据
File file = new File(getFilesDir(),"info.txt");
FileOutputStream out = new FileOutputStream(file);
out.write((num+"#sky#"+pwd).getBytes());
- 取数据
File file =new File(getFilesDir(),"info.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String line = br.readLine();
String[] split = line.split("#sky");
qqnum.setText(split[0]);
qqpwd.setText(split[1]);
当程序的内存不够时,会优先删除cache的数据,所以平常应该把用户的信息应该保存在files文件夹下
二、保存到公共的sd卡上
有些数据是需要共享的,如,本地的歌曲或视频,要手机内共享。可以放在/mnt/adcard公共目录下,对应的外部的sdcard。
//1.拿到sd卡的目录
Environment.getExternalStorageDirectory()
//2.拿到SD卡的大小
Environment.getExternalStorageDirectory().getTotalSpace
//3.对文件的大小进行转换
String total = Formatter.formatFileSize(getApplicationContext(), totalSpace);
String free = Formatter.formatFileSize(getApplicationContext(), freeSpace);
三、 sharedpreferences保存
有点像javaweb中servlet的request,有set、get来存取数据。这个方法产生的config.xml文件存在对应包的shared_prefs中
- 存数据
//1.先得到对象,一般权限设置为私有
SharedPreferences sp=getSharedPreferences("config",MODE_PRIVATE);
//2.得到一个编辑器
Editor edit=sp.edit();
//3.往编辑器中存值,name---value键值对
edit.putString("number",number);
edit.putString("pwd",pwd);
//4.数据从内存写入,这个方法要求版本9以上
edit.apply();
- 取数据
//1.取出数据,先拿对象
SharedPreferences sp=getSharedPreferences("config",MODE_PRIVATE);
//2.由editor,相应方法
Editor edit=sp.edit();
String name=sp.get("number","");//后面的参数是设定的默认值
四、使用xml文件去保存
谷歌已经把PULL解析器集成到了eclipse中,可以直接使用。
- 要存储XML数据如下
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<student city="shenzhen">
<name>xiaoli</name>
<gender>female</gender>
</student>
- 存数据
//1.获取File对象,并用流关联
File file=new File(getFilesDir();
OutputStream out =new FileOutputStream(file,name+".xml));
//2.得到XML的serializer对象
XmlSerializer serializer =Xml.newSerializer();
//3.serializer与文件流关联
serializer.setOutput(out,"utf-8");
//4.开头开始存取
serializer.startDocument("utf-8",true);
serializer.startTag(null,"student");
//5.有属性用attribute搞进去
serializer.attribute(null, "city", city);
//6.存在啊存……
serializer.startTag(null, "name");
serializer.text(name);
serializer.endTag(null, "name");
serializer.startTag(null, "gender");
serializer.text(gender);
serializer.endTag(null, "gender");
//7.endtag结束
serializer.endTag(null, "student");
//8.endDocument,全文结束
serializer.endDocument();
//9.关流
out.close();
- 取数据
存在数据过程中,一般会创建一个javabean对象,把取出的数据存起来(这样方便统一的操作)。
//1.创建解析器
XmlPullParser parser = Xml.newPullParser();
//2.创建解析器的输入流并与文件关联
FileInputStream fis = new FileInputStream(file);
parser.setInput(fis, "utf-8");
//3.解析器得到 EventType()
int type = parser.getEventType();
//4.一行一行走,走到相应的数,去搞数据,并记录到javabean中
while(type!=XmlPullParser.END_DOCUMENT){
if(type==XmlPullParser.START_TAG){
if("student".equals(parser.getName())){
int count = parser.getAttributeCount();
String attributeValue = parser.getAttributeValue(0);
String attributeName = parser.getAttributeName(0);
//5.把属性存到javabean对象中
student.setCity(attributeValue);
}else if("name".equals(parser.getName())){
String sname = parser.nextText();
student.setName(sname);
}else if("gender".equals(parser.getName())){
String sgender = parser.nextText();
student.setGender(sgender);
}
}
type=parser.next();
}
serializer.endTag();