我正在尝试为这件事选择最好的方法。我所拥有的是一个xml文件,它可能包含多达5000个节点。每个节点包含5个子节点。
我需要的是将它重写到sqlite数据库中。如果我将这些xml转换成对象的集合,然后使用这个集合将它们插入到sqlite数据库中,对于像128RAM这样的较弱的设备来说,这是不是有点过分了?
或者我不应该在解析XML文件时构建集合和插入值?
对于用户来说,这将是罕见的操作。这一切都是关于将备份从xml恢复到设备的数据库。
发布于 2013-01-04 20:07:20
不,不要在内存中构建集合。取而代之的是使用AsyncTask和PullParser(这是目前安卓库中可用的最好的解析器)。
在AsyncTask的doInBackground()中,解析出一个批处理(比如25个)对象,然后调用dbOpenHelper.bulkInsert()将整个批处理一次保存到数据库中。
当然,在这里,您必须向SQLiteOpenHelper实现添加一个批量插入方法,以便一次插入一组行。
您可以了解如何为SQLiteOpenHelper HERE编写批量插入方法。为简洁起见,我添加了所需的核心方法。
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();
}发布于 2013-01-04 20:01:22
是的,如果一次加载所有xml (从它创建一个DOM ),将占用大量RAM。但是您可以使用SAX、StAX、PullParser等,它们将逐个节点读取文件,当它们命中感兴趣的节点时让您知道,您可以通过插入将该节点保存到DB中。
Stream解析全部5000个父节点的伪代码,每5个子节点使用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;
}https://stackoverflow.com/questions/14156779
复制相似问题