android---实现登录用户信息保存(XML)

前两天用SharedPreference实现了保存用户历史信息,当用户再次登录的时候在AutoCompleteTextView(仿google搜索自动提示框)中显示历史用户信息。
这次用户信息是通过XML保存的,其中比较中要的包括了XML数据的生成和XML数据的解析,以及生成apk私有数据。
XML数据生成:在将用户信息保存成XML数据前,我们应该先了解一个非常重要的类XmlSerializer,这个类帮助我们将需要保存成XML数据的信息进行序列化。
  1. public String writeToString(List<UserInfo> users){
  2.         //实现xml信息序列号的一个对象
  3.         XmlSerializer serializer=Xml.newSerializer();
  4.         StringWriter writer=new StringWriter();
  5.         try {
  6.             //xml数据经过序列化后保存到String中,然后将字串通过OutputStream保存为xml文件
  7.             serializer.setOutput(writer);
  8.             
  9.             //文档开始
  10.             serializer.startDocument("utf-8", true);
  11.             
  12.             //开始一个节点
  13.             serializer.startTag("", "users");
  14.             
  15.             //开始一个子节点
  16.             for(UserInfo user : users){
  17.                 serializer.startTag("", "user");
  18.                 serializer.attribute("", "id", String.valueOf(user.getId()));
  19.                 
  20.                 serializer.startTag("", "name");
  21.                 serializer.text(user.getName());
  22.                 serializer.endTag("", "name");
  23.                 
  24.                 serializer.startTag("", "pwd");
  25.                 serializer.text(user.getPwd());
  26.                 serializer.endTag("", "pwd");
  27.                 
  28.                 serializer.startTag("", "isremember");
  29.                 serializer.text(String.valueOf(user.getIsRemember()));
  30.                 serializer.endTag("", "isremember");
  31.                 
  32.                 serializer.endTag("", "user");
  33.             }
  34.             
  35.             serializer.endTag("", "users");
  36.             //关闭文档
  37.             serializer.endDocument();
  38.         } catch (IllegalArgumentException e) {
  39.             // TODO Auto-generated catch block
  40.             e.printStackTrace();
  41.         } catch (IllegalStateException e) {
  42.             // TODO Auto-generated catch block
  43.             e.printStackTrace();
  44.         } catch (IOException e) {
  45.             // TODO Auto-generated catch block
  46.             e.printStackTrace();
  47.         }
  48.         return writer.toString()
复制代码
将字串保存为apk的私有文件
  1. public boolean writeToXml(Context context,String str){
  2.         try {
  3.             OutputStream out=context.openFileOutput("users.xml", Context.MODE_PRIVATE);
  4.             OutputStreamWriter outw=new OutputStreamWriter(out);
  5.             try {
  6.                 outw.write(str);
  7.                 outw.close();
  8.                 out.close();
  9.                 return true;
  10.             } catch (IOException e) {
  11.                 // TODO Auto-generated catch block
  12.                 return false;
  13.             }
  14.         } catch (FileNotFoundException e) {
  15.             // TODO Auto-generated catch block
  16.             return false;
  17.         }
  18.     }
复制代码

XML数据解析由于使用DOM方法需要将整个XML文档加载内存中,对系统资源占用比较多,这对内存比较紧张的Android系统来说,使用DOM方法读取XML文档会有很大的限制。 所以使用SAX方法读取XML,以减少对内存资源的占用。使用SAX解析xml数据其实很简单,无非就是几个过程,startDocument——startElement——character——endElement——endDocumentstartDocument:开始解析xml数据,如果处理的数据很多,在这里实例化一个list对象。startElement:节点元素数据的处理,获取节点元素的属性值,往往在这里对抽象化的对象进行实例化如一个用户的信息UserInfo usercharacter:获得杰点元素的内容,在这里专门获得没有属性节点的内容,如<name>cbin</name>endElement:一个节点的结束,也就相当于一个用户信息的解析完毕,在这里将user添加到list中endDocument:XML数据解析结束
  1. public class UsersHandler extends DefaultHandler {

  2.     private List<UserInfo> list=null;
  3.     private UserInfo user=null;
  4.     private String tagname;
  5.     
  6.     //开始解析XML文档
  7.     @Override
  8.     public void startDocument() throws SAXException{
  9.         list=new ArrayList<UserInfo>();
  10.         super.startDocument();
  11.     }
  12.     
  13.     //开始处理节点,在这里获得节点属性值的(节点属性)
  14.     @Override
  15.     public void startElement(String uri, String localName, String qName, Attributes attributes)
  16.     throws SAXException{
  17.         if(localName.equals("user")){
  18.             user=new UserInfo();
  19.             user.setId(Integer.parseInt(attributes.getValue("id")));
  20.         }
  21.         this.tagname=localName;
  22.         super.startElement(uri, localName, qName, attributes);
  23.     }
  24.     
  25.     //处理没有属性的节点(节点内容)
  26.     @Override
  27.     public void characters(char[] ch, int start, int length) throws SAXException{
  28.         if(this.tagname!=""){
  29.             if(this.tagname.equals("name")){
  30.                 String str=new String(ch, start, length);
  31.                 user.setName(str);
  32.             }else if(this.tagname.equals("pwd")){
  33.                 String str=new String(ch, start, length);
  34.                 user.setPwd(str);
  35.             }else if(this.tagname.endsWith("isremember")){
  36.                 String str=new String(ch, start, length);
  37.                 user.setIsRemember(Integer.parseInt(str));
  38.             }
  39.         }
  40.         super.characters(ch, start, length);
  41.     }
  42.     
  43.     @Override
  44.     public void endElement(String uri, String localName, String qName) throws SAXException{
  45.         if(localName.equals("user")){
  46.             list.add(user);
  47.         }
  48.         super.endElement(uri, localName, qName);
  49.     }
  50.     
  51.     @Override
  52.     public void endDocument() throws SAXException{
  53.         super.endDocument();
  54.     }
  55.     
  56.     public List<UserInfo> getUserList(){
  57.         return list;
  58.     }
复制代码

表示层与SharedPreferences中实现用户登录大同小异,无非是一个登录的逻辑处理1、加载页面时,加载xml中数据,将用户名列表绑定AutoCompleteTextView2、假若从act中选定数据,根据用户名查找密码等信息绑定et、ck;3、登录成功,是新用户直接添加,老用户删除原有记录,重新记录用户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值