首先是jdbc 使用的是 SQLiteDatabase
/** * 连接数据库 * @param db * @return */ public static SQLiteDatabase connection(@NotNull String db) { return sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(db, null); }
然后我这边是读的流文件,考虑到内存大小和文件内容未知
采用读一行插一行
``
/**
* 将文件读成string
*/
private fun readFileAsString(url: String,insert:(s:String) -> String) {
var file =File(url)
if(!file.exists()){//不存在
System.out.println("url")
return
}
loading.show();
var thread =Thread({
System.out.println("线程")
var bufferedReader= BufferedReader(FileReader(file))
var line:String?=null
println("开始"+System.currentTimeMillis())
sql.beginTransaction()
while ({line=bufferedReader.readLine();line}()!=null){
//insert(line.toString())
var stmt =sql.compileStatement(insert(line.toString()));
stmt.execute();
stmt.clearBindings();
// println("ff"+System.currentTimeMillis())
}
println("结束"+System.currentTimeMillis())
bufferedReader.close()
sql.setTransactionSuccessful();
sql.endTransaction();
if(insert.equals(::import1)){
var list = dbQuery1()
runOnUiThread {
mList.clear()
mList.addAll(list)
mAdapter.notifyDataSetChanged()
dataImportSearchLL.visibility=View.VISIBLE
loading.dismiss()
}
}else if(insert.equals(::import2)){
var count= dbQuery2()
System.out.println(count)
runOnUiThread {
dataImportJZBNumTv.setText((count/2).toString())
loading.dismiss()
}
}
})
thread.start()
}
``
上面代码就是优化事务,可见他每次插入都开关了事务
插入需要用到SQLiteStatement说明这个就是SQLiteDatabase jdbc的封装的这个
SQLiteStatement可以使用mSQLiteStatement.bindString(1, randomName);来替换sql语句中的 ?占位符。毕竟这个就是为了优化插入的嘛,我直接喜欢用拼好的sql
然后优化效果: 插入数据约2000*40条,
优化前22秒
优化后4秒
网友评论