缓慢插入android数据库



我必须在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;
    }

但结果是,第二种方法和第一种方法一样慢!!!有人能告诉我如何提高插入数据库的速度吗?我用这些方法做错了什么?

谢谢!!!

您应该将外循环封装在事务中,并在insertData方法中去掉它。

现在,您为您的pdv集合的每个元素调用一个完整的开放事务、插入、集合成功链。如果pdv必须始终作为一个整体进行持久化,那么整个操作应该只使用一个事务。它将使您的代码明显更快。

// 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而不使用事务

最新更新