私はSAXパーサーを使用してXMLファイルをネットワーク上で解析しています。 解析中にデータをデータベースに追加したいので、INSERTクエリを使用してデータを追加します。しかし、各インサートには10〜15ミリ秒かかります。そして、私は解析と挿入にほぼ130秒かかっているほぼ150のレコードを持っています。 私はトランザクションで挿入クエリをラップしようとしましたが、それでも私は同じ時間を与えます。私は自分のコードを添付しています。私はそれを正しく解析しているのか、挿入トランザクションが間違っているのか分かりません。SAXパーサーの解析にデータベースの挿入に時間がかかります
XMLHandler.java
public class XMLHandler extends DefaultHandler {
private static boolean inKey = false;
private static boolean inCode = false;
private static boolean inTitle = false;
private static boolean inType = false;
private static boolean inRoom = false;
private static boolean inDescription = false;
private static boolean inStart = false;
private List List = new List();
public void startElement(String uri, String name, String qName,
Attributes atts) {
if (name.trim().equals("key"))
inKey = true;
else if (name.trim().equals("code"))
inCode = true;
else if (name.trim().equals("title"))
inTitle = true;
else if (name.trim().equals("type"))
inType = true;
else if (name.trim().equals("room"))
inRoom = true;
else if (name.trim().equals("description"))
inDescription = true;
else if (name.trim().equals("start"))
inClassStart = true;
}
public void endElement(String uri, String name, String qName)
throws SAXException {
if (name.trim().equals("key"))
inKey = false;
else if (name.trim().equals("code"))
inCode = false;
else if (name.trim().equals("title"))
inTitle = false;
else if (name.trim().equals("type"))
inType = false;
else if (name.trim().equals("room"))
inRoom = false;
else if (name.trim().equals("description"))
inDescription = false;
else if (name.trim().equals("start"))
inClassStart = false;
}
public void characters(char ch[], int start, int length) {
String chars = (new String(ch).substring(start, start + length));
try {
if(inKey)
List.key = chars;
if(inCode)
List.code = chars;
if(inTitle)
List.title = chars;
if(inType)
List.type = chars;
if(inRoom)
List.room = chars;
if(inDescription)
List.description = chars;
if(inStart)
List.start = chars;
DB.insertFeed(List.key, List.code, List.title, List.type, List.room, List.description, List.start);
} catch (Exception e) {
Log.e("NewsDroid", e.toString());
}
}
DatabaseManager.java
public void insertFeed(String key, String code, String title, String type, String room, String desc,String start) {
db.beginTransaction();
try{
String sql = "INSERT OR REPLACE INTO " + TEST+ "(KEY,CODE,TITLE, TYPE ,ROOM , DESCRIPTION, START) VALUES" + "(?,?,?,?,?,?,?);";
Object [] bindArgs = new Object[]{key,code,title,type,room, desc,start};
db.execSQL(sql, bindArgs);
db.setTransactionSuccessful();
}
catch (SQLException e){}
finally{
db.endTransaction();
}
}
しかし、ArrayListで解析中に文字列を個別に追加すると、時間がかかるでしょうか? – Change
はい、この方法では、同時に複数のレコードをデータベースに挿入するため、時間を節約できます。また、JSON形式で応答を受け取ることができれば、GSONまたはJACKSONパーサ(私はjacksonが好きです)を使って構文解析を高速化できます。 – akkilis
あなたが私にもっとどのようにih.bind(idIndex、Integer.parseInt(source.getId()))を追加するかを説明できれば可能です。 getId()関数とは何を意味し、何をしますか? – Change