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

Android中SharedPreferences使用和xml解析和序列化

2014-10-29 00:07 405 查看
SharedPreferences介绍:



做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。SharedPreferences正是Android中用于实现这中存储方式的技术。



SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。



使用SharedPreferences保存key-value对的步骤如下:

  (1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定。

  (2)使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。

  (3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。

  (4)通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。



SharedPreferences就像一个对象一样,需要了解怎么创建,数据怎么提交:

package com.itheima28.qqlogin.utils;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;

public class UtilsOfSharedPreferences {

	/**
	 * 保存用户信息到sd卡
	 * @param number
	 * @param password
	 * @return true 成功
	 */
	public static boolean saveUserInfo(Context context, String number, String password) {
		
		try {
			// /data/data/包名/shared_prefs/itheima28
			SharedPreferences sp = context.getSharedPreferences("itheima28", Context.MODE_PRIVATE);
			
			// 获得一个编辑对象
			Editor edit = sp.edit();
			
			// 存数据
			edit.putString("number", number);
			edit.putString("password", password);
			
			// 提交, 数据真正存储起来了.
			edit.commit();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	

	/**
	 * 到sd卡获取用户信息
	 * @return
	 */
	public static Map<String, String> getUserInfo(Context context) {
		
		SharedPreferences sp = context.getSharedPreferences("itheima28", Context.MODE_PRIVATE);
		
		String number = sp.getString("number", null);
		String password = sp.getString("password", null);
		
		if(!TextUtils.isEmpty(number) && !TextUtils.isEmpty(password)) {
			Map<String, String> userInfoMap = new HashMap<String, String>();
			userInfoMap.put("number", number);
			userInfoMap.put("password", password);
			return userInfoMap;
		}
		return null;
	}
}


Android中绝大多数用的是Pull解析,下面结合测试我们看看解析xml过程和写入本地磁盘过程:

测试时需要配置:

<!--     写入sd卡的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


<uses-library android:name="android.test.runner" />


下面看一个关于些人xml到磁盘和解析出来的程序:

package com.itheima28.xmldemo.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.os.Environment;
import android.test.AndroidTestCase;
import android.util.Log;
import android.util.Xml;

import com.itheima28.xmldemo.Person;

public class TestCase extends AndroidTestCase {

	public void test() {
		writeXmlToLocal();
		
//		List<Person> personList = parserXmlFromLocal();
//		
//		for (Person person : personList) {
//			Log.i("TestCase", person.toString());
//		}
	}
	
	/**
	 * 写xml文件到本地
	 */
	private void writeXmlToLocal() {
		List<Person> personList = getPersonList();
		
		// 获得序列化对象
		XmlSerializer serializer = Xml.newSerializer();
		
		try {
			File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
			FileOutputStream fos = new FileOutputStream(path);
			// 指定序列化对象输出的位置和编码
			serializer.setOutput(fos, "utf-8");
			
			serializer.startDocument("utf-8", true);	// 写开始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
			
			serializer.startTag(null, "persons");		// <persons>
			
			for (Person person : personList) {
				// 开始写人

				serializer.startTag(null, "person");	// <person>
				serializer.attribute(null, "id", String.valueOf(person.getId()));
				
				// 写名字
				serializer.startTag(null, "name");		// <name>
				serializer.text(person.getName());
				serializer.endTag(null, "name");		// </name>
				
				// 写年龄
				serializer.startTag(null, "age");		// <age>
				serializer.text(String.valueOf(person.getAge()));
				serializer.endTag(null, "age");		// </age>
				
				serializer.endTag(null, "person");	// </person>
			}
			
			serializer.endTag(null, "persons");			// </persons>
			
			serializer.endDocument();		// 结束
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	private List<Person> getPersonList() {
		List<Person> personList = new ArrayList<Person>();
		
		for (int i = 0; i < 30; i++) {
			personList.add(new Person(i, "wang" + i, 18 + i));
		}
		
		return personList;
	}
	
	private List<Person> parserXmlFromLocal() {
		try {
			File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
			FileInputStream fis = new FileInputStream(path);
			
			// 获得pull解析器对象
			XmlPullParser parser = Xml.newPullParser();
			// 指定解析的文件和编码格式
			parser.setInput(fis, "utf-8");
			
			int eventType = parser.getEventType(); 		// 获得事件类型
			
			List<Person> personList = null;
			Person person = null;
			String id;
			while(eventType != XmlPullParser.END_DOCUMENT) {
				String tagName = parser.getName();	// 获得当前节点的名称
				
				switch (eventType) {
				case XmlPullParser.START_TAG: 		// 当前等于开始节点  <person>
					if("persons".equals(tagName)) {	// <persons>
						personList = new ArrayList<Person>();
					} else if("person".equals(tagName)) { // <person id="1">
						person = new Person();
						id = parser.getAttributeValue(null, "id");
						person.setId(Integer.valueOf(id));
					} else if("name".equals(tagName)) { // <name>
						person.setName(parser.nextText());
					} else if("age".equals(tagName)) { // <age>
						person.setAge(Integer.parseInt(parser.nextText()));
					}
					break;
				case XmlPullParser.END_TAG:		// </persons>
					if("person".equals(tagName)) {
						// 需要把上面设置好值的person对象添加到集合中
						personList.add(person);
					}
					break;
				default:
					break;
				}
				
				eventType = parser.next();		// 获得下一个事件类型
			}
			return personList;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}


package com.itheima28.xmldemo;

public class Person {

	private int id;
	private String name;
	private int age;
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: