2012-01-29 108 views
0

我從XML解析數據並將其插入到我的數據庫中。但是這些是高達1000個Querys,必須在應用程序啓動之前完成。
因爲我必須使用FTS3搜索,插入會顯着減慢。加速數據庫插入

在我添加FTS3搜索之前,我使用BLOB。這很快。我如何加快速度?

我用這個FTS3表:

db.execSQL("CREATE VIRTUAL TABLE " + TABLE_FTS + " USING fts3(" + COL_ID + ", " + COL_KEY_ID + ", " + COL_KEY_NAME + ", " 
      + COL_KEY_WEBURL + ", " + COL_KEY_MAINURL + ", " + COL_KEY_LOGO + " " + ");"); 

,我插入的文本用這種方法:

 int init = 0; 
     for(int t = init; t < arr.length; t++){ 
      Log.i(TAG, "arr["+t+"] = " + arr[t].trim()); 

     if(r == 1) { 
      database.execSQL("INSERT INTO table (id) VALUES ('" + arr[t].trim() + "')"); 
      id_save = arr[t].trim(); 
      r++; 
     }else if(r == 2) { 
      database.execSQL("UPDATE table SET name='" + arr[t].trim() + "' WHERE id='" + id_save + "'"); 
      name_save = arr[t].trim(); 
      r++; 
     }else if(r == 3) { 
      database.execSQL("UPDATE table SET weburl='" + arr[t].trim() + "' WHERE id='" + id_save + "' AND name='" + name_save + "'"); 
      r++; 
     }else if(r == 4) { 
      database.execSQL("UPDATE tables SET mainurl='" + arr[t].trim() + "' WHERE id='" + id_save + "' AND name='" + name_save + "'"); 
      r++; 
     }else if(r == 5) { 
      database.execSQL("UPDATE table SET logo='" + arr[t].trim() + "' WHERE id='" + id_save + "' AND name='" + name_save + "'"); 
      r = 1; 
     } 

是否有優化它什麼好的辦法? 非常感謝!

回答

2

您需要大容量插入的速度。

使用DatabaseUtils.InsertHelper代替SQLiteDatabase.insert

+0

謝謝,我如何使用InsertHelper執行'UPDATE'? – Leandros 2012-01-29 16:09:03

+0

該死!這很快。我減少到只有3秒。大約20秒之前。史詩!非常感謝! – Leandros 2012-01-29 16:27:10

1

將此作爲一個異步任務,並找出您的方法,如果您正在執行1000個查詢,那麼您已經遇到了設計問題。考慮改變你的方法。

+0

感謝。我不知道如何以另一種方式來實現我的目標。 我有一個ListView,有大約180個條目(從XML解析,因爲一切都是可變的)。每個條目還包含4個其他數據(網址和名稱)。 你有一個想法,我怎麼能更好地接近它? – Leandros 2012-01-29 03:33:36

+0

不要把它放在一個列表中,而應該考慮把它分解成基於關係的方式,你不必查詢任何事情。 – JoxTraex 2012-01-29 03:37:33

+0

手段我應該只插入,如果我需要它。好理想,但如何讓這個工作。 我想這會讓我的listview laggy。 – Leandros 2012-01-29 03:56:03

1

我同意最好的方法是使用線程,但是從UI的角度來看,以及Android推薦的內容(長期任務可能會被殺死以釋放空間來執行更重要的任務),我會推薦使用Service。如果您可以管理作爲服務運行您的大流程,但在您的活動中(通過綁定或廣播)接收更新,您應該能夠在進行所有處理的同時更新UI。

另外,關於JSON是否比XML更快有爭議。有了這樣複雜的事情,這可能是值得嘗試的。最後,考慮使用SharedPreferences緩存數據(尤其是如果數據在會話之間不經常更改)。

+0

XML解析在1秒內完成。數據插入過去大約20秒... 數據變化不在我手中,它可以每天更改5次,或每週更改1次。 – Leandros 2012-01-29 04:15:55

+0

我不認爲使用SharedPreferences的數據是一個好主意.. theres方式太多的數據要跟蹤...不高效,需要太多的維護 – JoxTraex 2012-01-29 07:36:05

+0

這是一個很好的觀點。數據庫結構會更有效。 – Phil 2012-01-29 14:32:15