Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 751|回复: 0

开发交流:android---实现登录用户信息保存(XML)[天幕杯]

[复制链接]

该用户从未签到

发表于 2011-10-24 09:29:33 | 显示全部楼层 |阅读模式
前两天用SharedPreference实现了保存用户历史信息,当用户再次登录的时候在AutoCompleteTextView(仿Google搜索自动提示框)中显示历史用户信息。
这次用户信息是通过XML保存的,其中比较中要的包括了XML数据的生成和XML数据的解析,以及生成apk私有数据。
XML数据生成:在将用户信息保存成XML数据前,我们应该先了解一个非常重要的类XmlSerializer,这个类帮助我们将需要保存成XML数据的信息进行序列化。
public String writeToString(List<UserInfo> users){

        //实现xml信息序列号的一个对象

        XmlSerializer serializer=Xml.newSerializer();

        StringWriter writer=new StringWriter();

        try {

            //xml数据经过序列化后保存到String中,然后将字串通过OutputStream保存为xml文件

            serializer.setOutput(writer);

            

            //文档开始

            serializer.startDocument("utf-8", true);

            

            //开始一个节点

            serializer.startTag("", "users");

            

            //开始一个子节点

            for(UserInfo user : users){

                serializer.startTag("", "user");

                serializer.attribute("", "id", String.valueOf(user.getId()));

               

                serializer.startTag("", "name");

                serializer.text(user.getName());

                serializer.endTag("", "name");

               

                serializer.startTag("", "pwd");

                serializer.text(user.getPwd());

                serializer.endTag("", "pwd");

               

                serializer.startTag("", "isremember");

                serializer.text(String.valueOf(user.getIsRemember()));

                serializer.endTag("", "isremember");

               

                serializer.endTag("", "user");

            }

            

            serializer.endTag("", "users");

            //关闭文档

            serializer.endDocument();

        } catch (IllegalArgumentException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (IllegalStateException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return writer.toString()
复制代码将字串保存为apk的私有文件
public boolean writeToXml(Context context,String str){

        try {

            OutputStream out=context.openFileOutput("users.xml", Context.MODE_PRIVATE);

            OutputStreamWriter outw=new OutputStreamWriter(out);

            try {

                outw.write(str);

                outw.close();

                out.close();

                return true;

            } catch (IOException e) {

                // TODO Auto-generated catch block

                return false;

            }

        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block

            return false;

        }

    }
复制代码
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数据解析结束 public class UsersHandler extends DefaultHandler {



    private List<UserInfo> list=null;

    private UserInfo user=null;

    private String tagname;

   

    //开始解析XML文档

    @Override

    public void startDocument() throws SAXException{

        list=new ArrayList<UserInfo>();

        super.startDocument();

    }

   

    //开始处理节点,在这里获得节点属性值的(节点属性)

    @Override

    public void startElement(String uri, String localName, String qName, Attributes attributes)

    throws SAXException{

        if(localName.equals("user")){

            user=new UserInfo();

            user.setId(Integer.parseInt(attributes.getValue("id")));

        }

        this.tagname=localName;

        super.startElement(uri, localName, qName, attributes);

    }

   

    //处理没有属性的节点(节点内容)

    @Override

    public void characters(char[] ch, int start, int length) throws SAXException{

        if(this.tagname!=""){

            if(this.tagname.equals("name")){

                String str=new String(ch, start, length);

                user.setName(str);

            }else if(this.tagname.equals("pwd")){

                String str=new String(ch, start, length);

                user.setPwd(str);

            }else if(this.tagname.endsWith("isremember")){

                String str=new String(ch, start, length);

                user.setIsRemember(Integer.parseInt(str));

            }

        }

        super.characters(ch, start, length);

    }

   

    @Override

    public void endElement(String uri, String localName, String qName) throws SAXException{

        if(localName.equals("user")){

            list.add(user);

        }

        super.endElement(uri, localName, qName);

    }

   

    @Override

    public void endDocument() throws SAXException{

        super.endDocument();

    }

   

    public List<UserInfo> getUserList(){

        return list;

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 19:03 , Processed in 0.330860 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表