从XML恢复大量数据

时间:2013-01-04 11:58:12

标签: android xml sqlite

我正在尝试为此选择最佳方法。我所拥有的是一个xml文件,最多可包含5000个节点。每个包含5个子节点。

我需要的是将其重写为sqlite数据库。如果我将那些xml翻译成对象集合然后使用这个集合将它们插入到sqlite数据库中,那么对于那些可能有128RAM的较弱设备来说难道不会有点过分吗?

或者我不应该在解析XML文件时构建集合并插入值?

对于用户来说这将是罕见的操作。这就是将备份从xml恢复到设备的数据库。

2 个答案:

答案 0 :(得分:2)

是的,如果你一次加载所有的xml(从它创建一个DOM),它将需要大量的RAM。但是您可以使用SAX,StAX,PullParser等按节点逐节读取文件,让您知道它们何时到达一个有趣的节点,并且您可以通过插入将该节点保存到DB。

用于Stream解析所有5000个父节点的伪代码,每个子节点使用DOM:

while(not end node){
   Node n = Parser.readNextNode();
   saveIfInteresting(n);
}

saveIfInteresting(Node n){
   if(interesting){
     values = extractValues(n);
     db.insert(values);
   }
}

extractValues(Node n){
  //--just 5 child nodes, can do with a small DOM--
  Document d = buildDOM(n);
  for(Element e in d){
    Values.add(e.getText());
  }
  return values;

  //OR

  //---stream parse children too--
  while(not parent end node){
    Node n = Parser.readNext();
    if(n is required child){
      values.add(n.getText());
    }
  }
  return values;
}

答案 1 :(得分:2)

不,不要在内存中构建集合。而是使用AsyncTaskPullParser(目前是Android库中最好的解析器)。

doInBackground()的{​​{1}}中,解析出一批(比如25个)对象,然后调用AsyncTask将整个批次保存到数据库中。

当然,在这里,你必须在SQLiteOpenHelper实现中添加一个批量插入方法,以便一次插入一堆行。

您可以了解如何为SQLiteOpenHelper HERE编写批量插入方法。为简明扼要,我添加了所需的核心方法。

dbOpenHelper.bulkInsert()