2014-10-30 63 views
-2

我想在android SQLite中插入3000多条记录,但下面的代码需要很多时间来处理数据inserion 这是我的代码。如何提高SQLite的性能?

public boolean addSale(Sale objSale) { 
    ContentValues values = new ContentValues(); 
    values.put(SALE_BRANCH, objSale.getBranch()); 
    values.put(SALE_SUPPLIER, objSale.getSupplier()); 
    values.put(SALE_BUYER, objSale.getBuyer()); 
    values.put(SALE_CAT1, objSale.getCat1()); 
    values.put(SALE_CAT2, objSale.getCat2()); 
    values.put(SALE_CAT3, objSale.getCat3()); 
    values.put(SALE_CAT4, objSale.getCat4()); 
    values.put(SALE_CAT5, objSale.getCat5()); 
    values.put(SALE_CAT6, objSale.getCat6()); 
    values.put(SALE_DESIGNO, objSale.getDesigNo()); 
    values.put(SALE_ITEMSIZE, objSale.getItemSize()); 
    values.put(SALE_SALEQTY, objSale.getSaleQty()); 
    values.put(SALE_STOCKQTY, objSale.getStockQty()); 
    values.put(SALE_FinalProduct, objSale.getFinalProduct()); 
    values.put(SALE_PriceRange, objSale.getPriceRange()); 
    values.put(SALE_CoreNonCore, objSale.getCoreNonCore()); 
    values.put(SALE_Color, objSale.getColor()); 
    values.put(SALE_GSLCode, objSale.getGSLCode()); 
    values.put(SALE_Wanted, objSale.getWanted()); 
    values.put(SALE_Pqty, objSale.getPqty()); 
    values.put(SALE_MRP, objSale.getMRP()); 
    values.put(SALE_PRate, objSale.getPRate()); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.insert(TABLE_SALE, null, values); 
    db.close(); 
    return true; 
} 

而这一个是我的Asynk任务。其中,i取从web服务数据,并插入到SQLite的

protected void onPostExecute(String result) 
     { 
      try { 

       String l = result.replace("\\", ""); 
       l = l.replace("''", ""); 
       String sdsd = l.substring(1, l.length() - 1); 
       JSONArray jsonArray = new JSONArray(sdsd); 
       Log.i("JSON", "Number of surveys in feed: " +jsonArray.length()); 
       /*if(db.delSaleData()){ 

       }*/ 
        for (int i = 0; i < jsonArray.length(); i++) 
        { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 

          sl.setBranch(jsonObject.getString("Branch")); 
          sl.setSupplier(jsonObject.getString("Supplier")); 
          sl.setBuyer(jsonObject.getString("Buyer")); 
          sl.setCat1(jsonObject.getString("Cat1")); 
          sl.setCat2(jsonObject.getString("Cat2")); 
          sl.setCat3(jsonObject.getString("Cat3")); 
          sl.setCat4(jsonObject.getString("Cat4")); 
          sl.setCat5(jsonObject.getString("Cat5")); 
          sl.setCat6(jsonObject.getString("Cat6")); 
          sl.setDesigNo(jsonObject.getString("DesigNo")); 
          sl.setItemSize(jsonObject.getString("ItemSize")); 
          sl.setSaleQty(jsonObject.getString("SaleQty")); 
          sl.setStockQty(jsonObject.getString("StockQty")); 
          sl.setFinalProduct(jsonObject.getString("FinalProduct")); 
          sl.setPriceRange(jsonObject.getString("PriceRange")); 
          sl.setCoreNonCore(jsonObject.getString("CoreNonCore")); 
          sl.setColor(jsonObject.getString("Color")); 
          sl.setGSLCode(jsonObject.getString("GSLCode")); 
          sl.setWanted(jsonObject.getString("Wanted")); 
          sl.setPqty(jsonObject.getString("Pqty")); 
          sl.setMRP(jsonObject.getString("MRP")); 
          sl.setPRate(jsonObject.getString("PRate")); 

          if(db.addSale(sl)) 
          { 
           //Toast.makeText(getApplicationContext(), " Insert.." , Toast.LENGTH_SHORT).show(); 
          } 
        } 

        setData(); 


       } catch (Exception e) { 
        e.printStackTrace(); 
      } 
      dialog.dismiss(); 
      setTableData("All"); 


     } 
+0

检查这个.. http://www.techrepublic.com/blog/software-engineer/turbocharge-your-sqlite-inserts-on-android/ – 2014-10-30 13:56:30

+0

待办事项你只有在应用程序首次启动时才这样做? – Simas 2014-10-30 13:59:03

+0

这在这个问题中是否有任何错误?如果不是,那么为什么投票否定? – 2014-10-30 14:47:55

回答

-1

使用Async类。执行操作onBackground,而不是在主UI线程中。

UPDATE

在你的代码,您通过onPost,不onBackground插入SQLite的。 onPost在UI线程上做事情,而onBackground在单独的(后台)线程上做它,所以它不影响用户界面。所以移动到onBackground的操作代码。

+0

这是否可以提高SQLite性能? – Simas 2014-10-30 13:54:50

+0

是的..所有插入都在Asynk任务中执行.. – 2014-10-30 13:55:11

+0

@ user3249477是的,它使得UI线程像平常一样运行,所以用户不会注意到你正在插入数据库。请记住,我们在这里谈论数千行。 – 2014-10-30 13:57:01

1

每次想要插入时都不要打开和关闭数据库。打开一次,然后在退出应用程序时关闭它。

+0

+1,你也应该检查一下。 – 2014-10-30 14:01:33

2

使用SQLiteStatement例如:

private void bulkInsertRecords(String[] records) { 
      String sql = "INSERT INTO "+ SAMPLE_TABLE_NAME +" VALUES (?,?,?);"; 
      SQLiteStatement statement = sampleDB.compileStatement(sql); //Este é o prepare 
      sampleDB.beginTransaction(); 
      for (int i = 0; i<records.length; i++) { 
        statement.clearBindings(); 
        statement.bindString(1, records[0]); 
        statement.bindString(2, records[1]); 
        statement.bindString(3, records[2]); 
        statement.execute(); 
      } 
      sampleDB.setTransactionSuccessful(); 
      sampleDB.endTransaction(); 
} 
+0

这是否使它更快? – 2014-10-30 14:02:12

+0

真的......它使数据插入更快.. ?? – 2014-10-30 14:03:02

+0

是的,但阅读此链接以获取更多信息http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/ – Ludger 2014-10-30 14:07:32