【问题标题】:Inserting remote(internet) xml file in SQLite database in Android在Android的SQLite数据库中插入远程(互联网)xml文件
【发布时间】:2012-05-27 15:09:02
【问题描述】:

这是我的大问题。根据我搜索过的选项,一个是解析我需要的数据然后存储在 sqlite 中,另一个是将整个 xml 文件作为文本存储在 sqlite 中。我实际上不知道从哪里开始,但我认为第二个选项对我来说更可取.. 谁能指出我该怎么做?或者如果有更多关于我的问题的建议..

任何回复将不胜感激..谢谢!

【问题讨论】:

  • 取决于您的情况,您可以使用任何选项。但通常第一个选项更好的是你解析数据然后将该数据存储在数据库中
  • 我将如何做到这一点?你能指点我这个教程吗?我只是 sqlite 数据库的新手。哦,谢谢你的回复。

标签: android database sqlite xml-parsing


【解决方案1】:

对不起,我的英语不是很好。

我会选择第二个选项。您可以使用 XmlPullParser 和 XmlPullParserFactory 读取文件 XML:

    XmlPullParser xmlPullParser;  
    String output; 
    XmlPullParserFactory fabrica = null;

    File archivoXml = new File(Environment.getExternalStorageDirectory() + servicioXML); //servicioXML is a xml path 
    FileInputStream fisArchivo = null;
    XmlPullParser analizador = null;
    int tipoEvento = 0; 

    try {
        fisArchivo = new FileInputStream(archivoXml);
        fabrica = XmlPullParserFactory.newInstance();
        fabrica.setNamespaceAware(true);
        analizador = fabrica.newPullParser();
        analizador.setInput(new InputStreamReader(fisArchivo));
        fabrica = XmlPullParserFactory.newInstance();  
        xmlPullParser = fabrica.newPullParser();  
        xmlPullParser.setInput(fisArchivo, "UTF-8"); 
        tipoEvento = xmlPullParser.getEventType(); 

    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();

    } catch (XmlPullParserException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    while (tipoEvento != XmlPullParser.END_DOCUMENT) {  
        analizarEvento(tipoEvento);  
        try {  
            tipoEvento = xmlPullParser.next();  
        } catch (XmlPullParserException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    } 
}  


private void analizarEvento(int evento){  
    switch (evento) {  
    case XmlPullParser.START_DOCUMENT:  
        break;  

    case XmlPullParser.END_DOCUMENT:    
        break;  

    case XmlPullParser.START_TAG:   
        break;  

    case XmlPullParser.END_TAG:  
        break;  

    case XmlPullParser.TEXT:  
        output = xmlPullParser.getText();  
        AdapterBBDD.setDBField(output); //add the xml data to the database
        break;  
    }  

更多信息:XmlPullParser in Android

【讨论】:

  • 也许您在 DOM 解析器中有示例?因为我几乎所有的活动都使用 DOM。如果你有,请在此处发布你的答案。谢谢!
【解决方案2】:

最好将数据解析一次并存储在数据库中。你可以只查询需要的数据并显示。

 SAXParserFactory spf = SAXParserFactory.newInstance();
                    SAXParser sp = spf.newSAXParser();
                    XMLReader xr = sp.getXMLReader();
                    /** Create handler to handle XML Tags ( extends DefaultHandler ) */
                    XMLHandler dbXMLHandler = new XMLHandler();
                    xr.setContentHandler(dbXMLHandler);
                    InputStream is = new ByteArrayInputStream(
                            xmlData.getBytes("UTF-8"));
                    xr.parse(new InputSource(is));

    phoneList = XMLHandler.phoneList;
                for(int id = 0; id < phoneList.getID().size();id++)
                {
                    database.open();
                    database.insertupdateintoPhonebook(phoneList.getUserName().get(id),
                            phoneList.getUserName().get(id)
                                    .get(id), phoneList.getDOB().get(id)

                    database.close();
}

DBXMLHAndler.java如下

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;



public class XMLHandler extends DefaultHandler{
Boolean currentElement = false;
String currentValue = null;
public static Phonelist phoneList = null;

public static Phonelist getPhoneList() {
    return phoneList;
}

public static void setPhonelist(Phonelist phoneList) {
    DBXMLHandler.phoneList = phoneList;
}
@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

    currentElement = true;

    if (localName.equals("NewDataSet"))
    {
        phoneList = new Phonelist();
    }

}

/** Called when tag closing ( ex:- <name>AndroidPeople</name> 
 * -- </name> )*/
@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {

    currentElement = false;

    /** set value */ 
    if (localName.equalsIgnoreCase("Id"))
        phoneList.setID(currentValue);
    else if (localName.equalsIgnoreCase("Username"))
        phoneList.setUserName(currentValue);    
    else if (localName.equalsIgnoreCase("Dob"))
        phoneList.setDOB(currentValue);

}

/** Called to get tag characters ( ex:- <name>AndroidPeople</name> 
 * -- to get AndroidPeople Character ) */
@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {

    if (currentElement) {
        currentValue = new String(ch, start, length);
        currentElement = false;
    }

}

}

【讨论】:

  • 也许您在 DOM 解析器中有示例?因为我几乎所有的活动都使用 DOM。如果你有,请在此处发布你的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
相关资源
最近更新 更多