SQLite - 在Android应用中加速4,000行插入

jsk*_*dd3 1 java sqlite android

public synchronized void updateStop(ArrayList<StopBean> beanList){
    SQLiteDatabase db = getWritableDatabase();
    String query = "DELETE FROM 'stop'";
    db.execSQL(query);
    for(StopBean bean : beanList){
        String atco_code = bean.getAtco_code();
        String name = bean.getName();
        String locality = bean.getLocality();
        String bearing = bean.getBearing();
        String latitude = bean.getLatitude()+"";
        String longitude = bean.getLongitude()+"";

        ContentValues values = new ContentValues();
        values.put("atco_code", atco_code);
        values.put("name", name);
        values.put("locality", locality);
        values.put("bearing", bearing);
        values.put("latitude", latitude);
        values.put("longitude", longitude);
        db.insert("stop", null, values);
    }

    db.close();
}
Run Code Online (Sandbox Code Playgroud)

目前,我们的应用程序通过上述方法插入4,000行.这种方法的问题是实际执行需要10-15秒.显然,这对于简单的4,000行插入来说太长了.

如何更改此方法以便大大加快这些插入的执行时间?

Com*_*are 7

总结整个事情在交易,使用beginTransaction(),endTransaction()markTransactionAsSuccessful().现在,您每个插入执行一个事务,这意味着每个插入一个磁盘I/O脉冲,这将非常慢.

除此之外:

  • 不要ContentValues在循环的每次传递中分配新的

  • 摆脱局部变量(例如atco_code),以防它们没有被优化掉

  • 使用更有效的方法将数字转换为字符串而不是""(例如, Double.toString()

  • 尝试将一个普通的SQL INSERT语句编译到一个SQLiteStatement viacompileStatement(),看看它是否比调用更好insert()

如果您仍然不满意,请使用Traceview并确定剩余时间用于何处.