android SQL 优化

2020-03-12  本文已影响0人  ddsfec

首先是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秒

上一篇 下一篇

猜你喜欢

热点阅读