我最近继承了一个项目,其中一个 sqlite db 存储在用户 sdcard 上(只有表和列,没有内容)。对于初始安装(和后续数据更新),通过 saxParser 解析 XML 文件,将其内容存储到 db 列,如下所示:
萨克斯解析器:
@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 会有所帮助,但不幸的是甚至没有更快。有人可以在这里指出我的缺陷吗?