2015-10-21 107 views
-1

好吧,所以我一直在我的头靠墙撞了几天现在,我终于得出结论。Sqlite获取数据库方法缓慢

我想插入一个记录,只有当我需要时,我的响应时间非常缓慢,每个记录约120ms。我已经看到了关于优化插入语句的大部分线程,并且我实现了大多数推荐的实践;使用事务处理,使用预处理语句等。

日志记录和测试表明,大部分延迟来自基本步骤“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毫秒

+0

非常弱的基准...你需要明白,你正在阅读的所有thos最优化是为**多个**行插入... – Selvin

+0

我知道,我基本上都在尝试让事情更快。 – gregaj

+0

然后看看@王杰的回答... – Selvin

回答

1

你可以只保留一个SQLiteDatabase实例在您的整个应用程序中。

并退出应用程序时关闭它。 (例如,RapidORM,GreenDao,ORMLite)。

+1

是的,嘿嘿,ORMs会加速插入...和猪飞... – Selvin

+0

@Selvin我的意思是说,你可以缓存你的'SQLiteDatabase'实例,它会节省你的时间,因为'databaseHelper .getWritableDatabase()'只执行一次。 – WangJie

+0

首先,我不是gregaj,第二我同意你关于这部分(也不只是* getWritableDatabase()只执行一次。*将不会有多次调用助手的构造函数,助手的onCreate ...),但部分关于ORMs与问题的任何部分都没有关联......特别是在你加快速度时不适用 – Selvin