2013-01-21 34 views
1

我試圖使用「內部存儲」的方法來保留我的數據。在下面的代碼中,我試圖將xml寫入存儲。這是正確的方式嗎?我試圖用fileInputStream打開這個文件,但是我看到的讀取類的唯一函數是.read(),它顯然每次讀取一個字節的數據。這看起來很不方便讀取一個XML文件。我應該如何最好地讀/寫我的數據?用xml持久數據,如何實現一個xml讀取器?

@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     try { 
      FileOutputStream fos=openFileOutput(LOCALSTORAGEFILE,Context.MODE_PRIVATE); 
      XmlCreator create=new XmlCreator(); 
      fos.write(create.subjectListToXml(subjectMasterList).getBytes()); 
      fos.close(); 

     } catch (IOException ex) { 
      Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);  
     } 

public class XmlCreator { 
    XmlSerializer serializer=Xml.newSerializer(); 
    StringWriter writer=new StringWriter(); 

    public String subjectListToXml(ArrayList<Subject> masterList){ 
     try{ 
      serializer.setOutput(writer); 
      serializer.startDocument("UTF-8", true); 
      serializer.startTag("", "subjects"); 
      serializer.attribute(null, null, null); 
      for(Subject subject:masterList){ 
       serializer.endTag("","subject"); 
       for(Cards card:subject.getCards()){ 
        serializer.startTag("","card"); 
        serializer.startTag("","word"); 
        serializer.text(card.getCardFront()); 
        serializer.endTag("","word"); 
        serializer.endTag("", "card"); 
       } 
       serializer.endTag("", "subject"); 
      } 
       serializer.endTag("","subjects"); 
       serializer.endDocument(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return writer.toString(); 
    } 
} 
+0

你已經編寫了'serializer.endTag(「」,「subject」);'在你的代碼中兩次,不應該有一個人說'startTag'? –

+0

是的,謝謝你,錯過了。 –

回答

1

有沒有必要重新發明的東西。考慮使用SharedPreferences

如果你仍然想使用你的XML格式,並希望讀它的正確方法,這裏的東西,將讓你開始:

InputStream is = ... 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(is); 
doc.getDocumentElement().normalize(); 
NodeList myTags = doc.getElementsByTagName("your_xml_tag"); 

我也強烈建議XML/JSON庫Jackson 。它只能使用幾行代碼讀取和保存完整的對象。

+0

雖然這隻能存儲基元類型嗎?我試圖存儲對象 –

+0

謝謝,我將研究所有 –

+0

確實,SharedPreferences不支持非原始類型,您可以使用一些方法將其包裝爲字符串/字符串集,但我認爲傑克遜是什麼你正在尋找。一旦你開始使用傑克遜,你很可能會喜歡它! –