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就像一个对象一样,需要了解怎么创建,数据怎么提交:
Android中绝大多数用的是Pull解析,下面结合测试我们看看解析xml过程和写入本地磁盘过程:
测试时需要配置:
下面看一个关于些人xml到磁盘和解析出来的程序:
做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。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; } }
相关文章推荐
- Android中使用xml保存数据(xml文件序列化)及使用pull解析xml文件
- Android中使用PULL方式解析XML和XmlSerializer进行序列化
- Android XML解析大全及序列化的使用
- Android中使用XStream解析XML
- 使用AXMLParser解析apk中的AndroidManifest.xml
- android xml解析 XmlPullParser的使用
- Android 创建与解析XML(六)—— 比较与使用
- bak 6.android xml解析 XmlPullParser的使用.
- Android成长之路-使用Pull解析XML
- Android网络下使用SAX解析XML文档
- C#.NET解析XML(使用属性控制 XML 序列化)
- Android 中使用dom的方式解析XML
- android使用pull方式解析xml
- Android 创建与解析XML(六)—— 比较与使用
- Android中的XML解析-DOM的使用与开发技巧(转)
- android_xml解析之 使用PULL读取XML文件 .
- android 使用SAX解析xml
- android 使用 pull 解析xml文件
- android中使用哪种方式解析XML比较好
- Android 创建与解析XML(六)—— 比较与使用