我创建了2个不同的函数来做同样的事情:
逐行读取并将值插入数据库。
第一个(更快(从 csv 文件中读取信息;
load_voc(database, new InputStreamReader(myContext.getAssets().open(file_csv_vocaboli)));
private void load_voc(SQLiteDatabase db, InputStreamReader in ) {
BufferedReader reader = new BufferedReader(in);
try {
String line = null;
//Legge la riga del CSV e la inserisce nella tabella tramite il metodo getContentValues della classe Voc definita in fondo alla pagina
int i=0;
while ( (line = reader.readLine()) != null ) {
db.insert(Voc.TABLE_NAME, null, Voc.getContentValues(line));
Log.i(TAG_i,"test: "+i);
i++;
}
reader.close();
}
}
第二个(非常慢(从变量列表中获取信息;
private void load_voc_agg( List<String> csv_file_list_voc ) {
String line = null;
for(int i=0;i<csv_file_list_voc.size();i++){
database.insert(Voc.TABLE_NAME, null,
Voc.getContentValues(csv_file_list_voc.get(i)));
Log.i(TAG_i,"test: "+i);
}
}
我也尝试过
for(String s: csv_file_list_voc) {}
和
Iterator<String> iterator = csv_file_list_voc.iterator();
while(iterator.hasNext()) {}
结果相同。
我以为这是第二种方法最快,但它慢了 20 倍!
有什么建议吗?
谢谢。
您需要使用事务进行多次插入以获得更快的速度。应该是这样的:
private void load_voc_agg( List<String> csv_file_list_voc ) {
String line = null;
database.beginTransaction();
for(int i=0;i<csv_file_list_voc.size();i++){
database.insert(Voc.TABLE_NAME, null,
Voc.getContentValues(csv_file_list_voc.get(i)));
Log.i(TAG_i,"test: "+i);
}
database.setTransactionSuccessful();
database.endTransaction();
}
或者你可以将SQLiteStatement与事务一起使用:
private void load_voc_agg( List<String> csv_file_list_voc ) {
String line = null;
database.beginTransaction();
String sql = "insert into" + Voc.TABLE_NAME + " (col1, col2) values (?, ?);";
database.beginTransaction();
SQLiteStatement statement = database.compileStatement(sql);
for(int i=0;i<csv_file_list_voc.size();i++){
// Create your insert
statement.bindString(1, val1);
statement.bindString(2, val2);
long rowId = stmt.executeInsert();
stmt.clearBindings();
}
database.setTransactionSuccessful();
database.endTransaction();
}