天天看點

android登入成功後儲存使用者,Android---實作登入使用者資訊儲存

這次使用者資訊是通過XML儲存的,其中比較中要的包括了XML資料的生成和XML資料的解析,以及生成apk私有資料。

XML資料生成:在将使用者資訊儲存成XML資料前,我們應該先了解一個非常重要的類XmlSerializer,這個類幫助我們将需要儲存成XML資料的資訊進行序列化。

代碼

publicString writeToString(Listusers){//實作xml資訊序列号的一個對象XmlSerializer serializer=Xml.newSerializer();

StringWriter writer=newStringWriter();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 blocke.printStackTrace();

}catch(IllegalStateException e) {//TODO Auto-generated catch blocke.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch blocke.printStackTrace();

}returnwriter.toString();

}

将字串儲存為apk的私有檔案

代碼

publicbooleanwriteToXml(Context context,String str){try{

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

OutputStreamWriter outw=newOutputStreamWriter(out);try{

outw.write(str);

outw.close();

out.close();returntrue;

}catch(IOException e) {//TODO Auto-generated catch blockreturnfalse;

}

}catch(FileNotFoundException e) {//TODO Auto-generated catch blockreturnfalse;

}

}

XML資料解析

由于使用DOM方法需要将整個XML文檔加載記憶體中,對系統資源占用比較多,這對記憶體比較緊張的Android系統來說,使用DOM方法讀取XML文檔會有很大的限制。 是以使用SAX方法讀取XML,以減少對記憶體資源的占用。

使用SAX解析xml資料其實很簡單,無非就是幾個過程,startDocument——startElement——character——endElement——endDocument

startDocument:開始解析xml資料,如果處理的資料很多,在這裡執行個體化一個list對象。

startElement:節點元素資料的處理,擷取節點元素的屬性值,往往在這裡對抽象化的對象進行執行個體化如一個使用者的資訊UserInfo user

character:獲得傑點元素的内容,在這裡專門獲得沒有屬性節點的内容,如cbin

endElement:一個節點的結束,也就相當于一個使用者資訊的解析完畢,在這裡将user添加到list中

endDocument:XML資料解析結束

代碼

publicclassUsersHandlerextendsDefaultHandler {privateListlist=null;privateUserInfo user=null;privateString tagname;//開始解析XML文檔@OverridepublicvoidstartDocument()throwsSAXException{

list=newArrayList();super.startDocument();

}//開始處理節點,在這裡獲得節點屬性值的(節點屬性)@OverridepublicvoidstartElement(String uri, String localName, String qName, Attributes attributes)throwsSAXException{if(localName.equals("user")){

user=newUserInfo();

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

}this.tagname=localName;super.startElement(uri, localName, qName, attributes);

}//處理沒有屬性的節點(節點内容)@Overridepublicvoidcharacters(char[] ch,intstart,intlength)throwsSAXException{if(this.tagname!=""){if(this.tagname.equals("name")){

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

user.setName(str);

}elseif(this.tagname.equals("pwd")){

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

user.setPwd(str);

}elseif(this.tagname.endsWith("isremember")){

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

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

}

}super.characters(ch, start, length);

}

@OverridepublicvoidendElement(String uri, String localName, String qName)throwsSAXException{if(localName.equals("user")){

list.add(user);

}super.endElement(uri, localName, qName);

}

@OverridepublicvoidendDocument()throwsSAXException{super.endDocument();

}publicListgetUserList(){returnlist;

}

}

表示層與SharedPreferences中實作使用者登入大同小異,無非是一個登入的邏輯處理

1、加載頁面時,加載xml中資料,将使用者名清單綁定AutoCompleteTextView

2、假若從act中標明資料,根據使用者名查找密碼等資訊綁定et、ck;

3、登入成功,是新使用者直接添加,老使用者删除原有記錄,重新記錄使用者資訊。