這次使用者資訊是通過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、登入成功,是新使用者直接添加,老使用者删除原有記錄,重新記錄使用者資訊。