2016-04-14 8 views
0

上記のコードを使用してDBに3000レコードを挿入しています。サーバからparamのリストを取得していますが、問題はエミュレータで2.5分かかります実際のデバイスでは2倍になります。SQLiteに1000レコードの挿入を最適化するには

挿入を最適化する方法を教えてください。

はここ

public boolean insertRowDynamically(TableData tableData, String tableName) { 

     keysStringBuilder.delete(0,keysStringBuilder.length()); 
     valuesStringbuilder.delete(0,valuesStringbuilder.length()); 
     SQLiteStatement sqLiteStatement = null; 
     response = true; 
     flag = true; 
     first=true; 
     LinkedHashMap<String,Object> values= new LinkedHashMap<>(); 
     List<Map<String, Object>> rowValue = tableData.getListofMapRecords(); 
     try { 
      openDataBase(); 
      myDataBase = this.getWritableDatabase(); 
      myDataBase.beginTransactionNonExclusive(); 


      int i=0; 
     for (Map<String, Object> map : rowValue) { 

      values.clear(); 
      values.putAll(map); 
      Set keys = values.keySet(); 
      Iterator<String> it = keys.iterator(); 




        i=1; 
       while (it.hasNext()) { 
        String key = it.next(); 
        if (flag) { 

         keysStringBuilder.append(key); 
         valuesStringbuilder.append("?"); 

         flag = false; 
        } else { 
         keysStringBuilder.append(", ").append(key); 
         valuesStringbuilder.append(", ").append("?"); 
        } 
        if (!it.hasNext()) { 
         String query = "INSERT INTO " + tableName + "(" + keysStringBuilder + ") VALUES(" + valuesStringbuilder + ")"; 
         sqLiteStatement = myDataBase.compileStatement(query); 
        } 




       } 




      } 





      first = false; 
       i=1; 


      for (String key :values.keySet()) 
      { 
       sqLiteStatement.bindString(i,values.get(key).toString()); 
       i++; 

      } 


      sqLiteStatement.executeInsert(); 
      sqLiteStatement.clearBindings(); 











      } catch (SQLException e) { 
       Log.d("Syncing Data", "From insertRowDynamically " + e); 
      } finally { 

       close(); 
      } 


     return response; 
    } 
+0

あなたはhttp://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.htmlで見たことがありますか? – Toorop

+1

こんにちは、私は何を提案しようとしましたか? –

+0

@GoltsevEugene与えられたコードにいくつかの変更を加え、私のために働き始めました。 –

答えて

0

ではなく、行レベルのトランザクションのテーブルレベルのtranactionsを利用し始めたし、それがために魔法のように働いていた私のコードです。

public boolean insertRowDynamically(TableData tableData, String tableName) { 

     keysStringBuilder.delete(0,keysStringBuilder.length()); 
     valuesStringbuilder.delete(0, valuesStringbuilder.length()); 
     SQLiteStatement sqLiteStatement = null; 
     response = true; 
     flag = true; 
     first=true; 
     LinkedHashMap<String,Object> values= new LinkedHashMap<>(); 
     List<Map<String, Object>> rowValue = tableData.getListofMapRecords(); 
     try { 
      openDataBase(); 
      myDataBase = this.getWritableDatabase(); 
      myDataBase.beginTransactionNonExclusive(); 
      int i=0; 
      Log.d("Sync Time","Table Data Size "+rowValue.size()); 
     for (Map<String, Object> map : rowValue) { 

      values.clear(); 
      values.putAll(map); 
      Set keys = values.keySet(); 
      Iterator<String> it = keys.iterator(); 


      i = 1; 
      if (first) { 
       while (it.hasNext()) { 
        String key = it.next(); 
        if (flag) { 

         keysStringBuilder.append(key); 
         valuesStringbuilder.append("?"); 

         flag = false; 
        } else { 
         keysStringBuilder.append(", ").append(key); 
         valuesStringbuilder.append(", ").append("?"); 
        } 
        if (!it.hasNext()) { 
         String query = "INSERT INTO " + tableName + "(" + keysStringBuilder + ") VALUES(" + valuesStringbuilder + ")"; 
         sqLiteStatement = myDataBase.compileStatement(query); 
        } 


       } 


      } 


      first = false; 
      i=1; 


      for (String key :values.keySet()) 
      { 
       sqLiteStatement.bindString(i,values.get(key).toString()); 
       i++; 

      } 


      sqLiteStatement.executeInsert(); 
      sqLiteStatement.clearBindings(); 

     } 

      myDataBase.setTransactionSuccessful(); 
      myDataBase.endTransaction(); 

      } catch (SQLException e) { 
       Log.d("Syncing Data", "From insertRowDynamically " + e); 
      } finally { 

       close(); 
      } 


     return response; 
    } 
関連する問題