2013-01-21 31 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不支持非原始类型,您可以使用一些方法将其包装为字符串/字符串集,但我认为杰克逊是什么你正在寻找。一旦你开始使用杰克逊,你很可能会喜欢它! –