我正在尝试为此选择最佳方法。我所拥有的是一个xml文件,最多可包含5000个节点。每个包含5个子节点。
我需要的是将其重写为sqlite数据库。如果我将那些xml翻译成对象集合然后使用这个集合将它们插入到sqlite数据库中,那么对于那些可能有128RAM的较弱设备来说难道不会有点过分吗?
或者我不应该在解析XML文件时构建集合并插入值?
对于用户来说这将是罕见的操作。这就是将备份从xml恢复到设备的数据库。
答案 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)
不,不要在内存中构建集合。而是使用AsyncTask
和PullParser
(目前是Android库中最好的解析器)。
在doInBackground()
的{{1}}中,解析出一批(比如25个)对象,然后调用AsyncTask
将整个批次保存到数据库中。
当然,在这里,你必须在SQLiteOpenHelper实现中添加一个批量插入方法,以便一次插入一堆行。
您可以了解如何为SQLiteOpenHelper HERE编写批量插入方法。为简明扼要,我添加了所需的核心方法。
dbOpenHelper.bulkInsert()