0

私はこれに最適なアプローチを選択しようとしています。私が持っているのは、最大5000ノードで構成されるxmlファイルです。それぞれが5つの子ノードを保持します。

私が必要としているのは、それをsqliteデータベースに書き直すことです。それらのxmlをオブジェクトのコレクションに変換し、このコレクションを使用してそれらをsqliteデータベースに挿入すると、128RAMのような弱いデバイスにとってはやり過ぎではないでしょうか?

または、XMLファイルを解析するときに、コレクションを作成して値を挿入するべきではありませんか?

ユーザーにとってはまれな操作になります。それはすべて、xmlからデバイスのデータベースにバックアップを復元することです。

4

2 に答える 2

2

はい、すべての xml を一度に読み込む (そこから DOM を作成する) と、大量の RAM が必要になります。ただし、SAX、StAX、PullParser などを使用して、ノードごとにファイルを読み取り、興味深いノードにヒットしたときに通知し、挿入によってそのノードを DB に保存できます。

5 つの子ノードごとに DOM を使用して、5000 個の親ノードすべてを解析するストリームの疑似コード:

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;
}
于 2013-01-04T12:01:21.600 に答える
2

いいえ、コレクションをメモリに構築しません。代わりAsyncTaskに with を使用しますPullParser(これは現在、Android ライブラリで利用できる最高のパーサーです)。

doInBackground()AsyncTask、バッチ (たとえば 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-04T12:07:20.297 に答える