Sqlite获取数据库方法很慢

时间:2015-10-21 08:32:45

标签: android performance sqlite android-sqlite

好的,所以我现在已经把头撞到墙上好几天了,我终于得出结论了。

我正在尝试仅在需要时插入一条记录,我的响应时间非常慢,每条记录大约120毫秒。我已经在SO上看到了关于优化插入语句的大部分线程,并且我实现了大多数推荐的实践;使用事务,使用预准备语句等。

记录和测试向我展示了大部分延迟来自基本步骤" databaseHelper.getWritableDatabase()"获得可写数据库需要大约90ms。

这个问题有没有可接受的解决方案?

这是我插入的方法:

 public static void insertEBlago3(Context context, EItemInvoiceDto itemDto, EParamDto eparamDto) throws Exception {
        long startTime = System.currentTimeMillis();
        DatabaseHelper databaseHelper = new DatabaseHelper(context);
        SQLiteDatabase database = null;
        try {
            Log.v("Dodaj", "get writable database " + (System.currentTimeMillis() - startTime));
            database = databaseHelper.getWritableDatabase();
            // Begin transaction.
            Log.v("Dodaj", "begin transaction " + (System.currentTimeMillis() - startTime));
            database.beginTransaction();
            Log.v("Dodaj", "Preparing sql " + (System.currentTimeMillis() - startTime));
            String sqlInsertEBlago3 = "INSERT INTO emaloprod3 (leto, gd, strmst, zaporedna, datdok, casdok, idlokacije, blago, kolicina, "
                    + "osnova, cena, ddv, popust, ncena, rabat, marza, narocilo, naroc, naroc_kol, opomba) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            Log.v("Dodaj", "Before compile " + (System.currentTimeMillis() - startTime));
            SQLiteStatement stat = database.compileStatement(sqlInsertEBlago3);
            Log.v("Dodaj", "After compile " + (System.currentTimeMillis() - startTime));
           /***binding data****/
            // End transaction.
            stat.executeInsert();
            Log.v("Dodaj", "Insert " + (System.currentTimeMillis() - startTime));
            database.setTransactionSuccessful();
        } catch (Exception e) {
            throw e;
//          Log.e(TAG, e.getMessage(), e);
//          e.printStackTrace();
        } finally {
            // End transaction.
            database.endTransaction();
            DBHelper.closeAllConnections(null, null, database);
            Log.v("Dodaj", "Finish " + (System.currentTimeMillis() - startTime));
        }
    }

这是我的日志:

10-21 10:12:27.278 3759-3759/? V/Dodaj: get writable database 0
10-21 10:12:27.370 3759-3759/? V/Dodaj: begin transaction 92
10-21 10:12:27.370 3759-3759/? V/Dodaj: Preparing sql 92
10-21 10:12:27.370 3759-3759/? V/Dodaj: Before compile 92
10-21 10:12:27.370 3759-3759/? V/Dodaj: After compile 92
10-21 10:12:27.384 3759-3759/? V/Dodaj: Insert 106
10-21 10:12:27.399 3759-3759/? V/Dodaj: Finish 121

正如您所看到的,可写数据库需要92毫秒

1 个答案:

答案 0 :(得分:1)

您的整个申请中只能保留一个SQLiteDatabase个实例。

退出应用程序时关闭它。

您还可以使用ORM(例如RapidORMGreenDaoORMLite)。