我必须在android数据库中插入以下字段:
此代码在我的活动中
for(int k=0; k<pdvs.size(); k++)
{
Map<String, String> testMap1 = new HashMap<String, String>();
testMap1.put("pos_id", pdvs.get(k).pos_id);
testMap1.put("visit_date", pdvs.get(k).nextvisitDate);
testMap1.put("roadmap_id", String.valueOf(roadmap_id));
testMap1.put("sys_visit_status_id", "1");
testMap1.put("gps_latitude", "5");
testMap1.put("gps_longitude", "5");
db.insertData("pos_visit", testMap1);
}
大约有16行要插入......不是那么多。我仍然尝试使用这样的ContentValues
:
这是来自SQLiteOpenHelper类的代码
public long insertData(String tableName, Map<String, String> map) {
long id;
ContentValues columnValues = new ContentValues();
db.beginTransaction();
try{
for (Map.Entry<String, String> entry : map.entrySet()) {
String columnName = entry.getKey();
String value = entry.getValue();
columnValues.put(columnName, value);
}
id = db.insert(tableName, null, columnValues);
db.setTransactionSuccessful();
}finally{
db.endTransaction();
}
return id;
}
但引入16行仍需要大约10-12秒。无论如何,在那之后我发现了InsertHelper
已知更快,我做了这个:
public long insertData(String tableName, Map<String, String> map) {
long id = 0;
int i = 0;
int [] columnIndex = new int[map.size()];
String [] value = new String[map.size()];
InsertHelper ih = new InsertHelper(db, tableName);
for (Map.Entry<String, String> entry : map.entrySet()) {
String columnName = entry.getKey();
columnIndex[i] = ih.getColumnIndex(columnName);
value[i] = entry.getValue();
i++;
}
try{
ih.prepareForInsert();
for (int k=0; k<columnIndex.length; k++) {
ih.bind(columnIndex[k], value[k]);
}
id = ih.execute();
}finally{
ih.close();
}
return id;
}
但结果是第二种方法和第一种方法一样慢!!!任何人都可以告诉我如何提高插入数据库的速度?我在这些方法中做错了什么?
谢谢!!!
答案 0 :(得分:0)
您应该将外部循环包装在事务中,并在insertData方法中删除它。
现在,您为pdvs集的每个元素调用一个完整的开放事务链,插入,设置成功。如果pdv必须始终作为一个整体保留,那么您应该只对整个操作使用1个事务。它会使你的代码明显加快。
// begin transaction here
for(int k=0; k<pdvs.size(); k++)
{
Map<String, String> testMap1 = new HashMap<String, String>();
testMap1.put("pos_id", pdvs.get(k).pos_id);
testMap1.put("visit_date", pdvs.get(k).nextvisitDate);
testMap1.put("roadmap_id", String.valueOf(roadmap_id));
testMap1.put("sys_visit_status_id", "1");
testMap1.put("gps_latitude", "5");
testMap1.put("gps_longitude", "5");
db.insertData("pos_visit", testMap1);
}
//set success here
在你的insertData中只使用insert而不用事务