Android Sqlite获取数据库方法的速度很慢

Android Sqlite获取数据库方法的速度很慢,android,performance,sqlite,android-sqlite,Android,Performance,Sqlite,Android Sqlite,好吧,我已经把头撞在墙上好几天了,我终于得出结论了 我试图只在需要时插入一条记录,我的响应时间非常慢,每条记录大约120毫秒。我在这里看到了关于优化insert语句的大多数线程,并且实现了大多数推荐的实践;使用事务、使用准备好的报表等 日志记录和测试表明,大部分延迟来自基本步骤“databaseHelper.getWritableDatabase()”。获取可写数据库大约需要90毫秒 这个问题有没有可以接受的解决方案 这是我插入的方法: public static void insertEBl

好吧,我已经把头撞在墙上好几天了,我终于得出结论了

我试图只在需要时插入一条记录,我的响应时间非常慢,每条记录大约120毫秒。我在这里看到了关于优化insert语句的大多数线程,并且实现了大多数推荐的实践;使用事务、使用准备好的报表等

日志记录和测试表明,大部分延迟来自基本步骤“databaseHelper.getWritableDatabase()”。获取可写数据库大约需要90毫秒

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

这是我插入的方法:

 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 ms,您只能在整个应用程序中保留一个
SQLiteDatabase
实例

并在退出应用程序时将其关闭


您还可以使用
ORM
(例如),

非常弱的基准测试。。。你需要明白,你正在阅读的所有优化都是为了多行插入…我知道,虽然我基本上在尽一切努力加快速度…然后看看@WangJie的答案…120ms没什么大不了的(在真正的设备上?或模拟器上?)。。。您应该考虑到,此操作可能会使用大量存储IO。。。记住:过早优化是所有弊病的根源。我在POS系统上工作,在收据上插入一个项目的120毫秒非常慢。@Selvin我的意思是你可以缓存你的
SQLiteDatabase
实例,这将节省你的时间,因为
databaseHelper.getwriteabledatabase()
只执行一次。首先,我不是gregaj,其次,我同意你关于这一部分的看法(而且不仅getWritableDatabase()只执行一次。不会多次调用helper的构造函数、helper的onCreate…),但是关于ORMs的部分与问题的任何部分都没有联系。。。特别是当你想加速某个东西时,这不适用于导致锁表问题吗?我使用不止一种方法来处理数据库。我更改了代码,所以databasehelper类只通过getInstance方法打开一次,我得到了1ms。否,如果使用此实例的方法是同步的。。。或者不,如果所有这些方法都是从同一个线程调用的…@Selvin好的,我也同意ORM不能加速。我建议这样做,因为ORM缓存
SQLiteDatabase
实例。