私は最近、ユーザーのSDカードにsqlite dbが保存されているプロジェクトを継承しました(テーブルと列のみ、コンテンツなし)。初期インストール (およびその後のデータ更新) では、saxParser を介して XML ファイルが解析され、次のように内容が db 列に格納されます。
saxパーサー:
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
currentElement = false;
if (localName.equals("StoreID")) {
buffer.toString().trim();
storeDetails.setStoreId(buffer.toString());
} else if (localName.equals("StoreName")) {
buffer.toString().trim();
storeDetails.setStoreName(buffer.toString());
...
} else if (localName.equals("StoreDescription")) {
buffer.toString().trim();
storeDetails.setStoreDescription(buffer.toString());
// when the final column is checked, call custom db helper method
dBHelper.addtoStoreDetail(storeDetails);
}
buffer = new StringBuffer();
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (currentElement) {
buffer.append(ch, start, length);
}
}
データベースヘルパー:
// add to StoreDetails table
public void addtoStoreDetail(StoreDetails storeDetails) {
SQLiteDatabase database = null;
InsertHelper ih = null;
try {
database = getWritableDatabase();
ih = new InsertHelper(database, "StoreDetails");
// Get the numeric indexes for each of the columns that we're updating
final int idColumn = ih.getColumnIndex("_id");
final int nameColumn = ih.getColumnIndex("StoreName");
...
final int descColumn = ih.getColumnIndex("StoreDescription");
// Add the data for each column
ih.bind(idColumn, storeDetails.getStoreId());
ih.bind(nameColumn, storeDetails.getStoreName());
...
ih.bind(descColumn, storeDetails.getStoreDescription());
// Insert the row into the database.
ih.execute();
} finally {
ih.close();
safeCloseDataBase(database);
}
}
読み込まれた xml ドキュメントの長さは 6000 行以上です。デバイスでテストすると、約 4 ~ 5 分かかる途中 (エラーなし) で挿入が停止します。ただし、エミュレーターではかなり高速に実行され、約 20 秒ですべての行がデータベースに書き込まれます。データベースが開かれ、データが追加され、閉じられたときに実行されるログステートメントがあります。デバイスで実行すると、LogCat 出力が大幅に遅くなります。私がここに欠けているものはありますか?データの書き込みに時間がかかるのはなぜですか? 改善された InsertHelper が役立つと思いましたが、残念ながら少しも速くはありませんでした。誰かがここで私の欠陥を指摘できますか?