首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从XML恢复大量数据

从XML恢复大量数据
EN

Stack Overflow用户
提问于 2013-01-04 19:58:12
回答 2查看 97关注 0票数 0

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

我需要的是将它重写到sqlite数据库中。如果我将这些xml转换成对象的集合,然后使用这个集合将它们插入到sqlite数据库中,对于像128RAM这样的较弱的设备来说,这是不是有点过分了?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-04 20:07:20

不,不要在内存中构建集合。取而代之的是使用AsyncTaskPullParser(这是目前安卓库中可用的最好的解析器)。

AsyncTaskdoInBackground()中,解析出一个批处理(比如25个)对象,然后调用dbOpenHelper.bulkInsert()将整个批处理一次保存到数据库中。

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

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

代码语言:javascript
复制
try{
  db.beginTransaction();
  for each record in the list {
     do_some_processing();
     if (line represent a valid  entry) {
        db.insert(SOME_TABLE, null, SOME_VALUE);
     }
     some_other_processing();
  }
  db.setTransactionSuccessful();
} catch (SQLException e) {
} finally {
  db.endTranscation();
}
票数 2
EN

Stack Overflow用户

发布于 2013-01-04 20:01:22

是的,如果一次加载所有xml (从它创建一个DOM ),将占用大量RAM。但是您可以使用SAX、StAX、PullParser等,它们将逐个节点读取文件,当它们命中感兴趣的节点时让您知道,您可以通过插入将该节点保存到DB中。

Stream解析全部5000个父节点的伪代码,每5个子节点使用DOM:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14156779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档