2014-02-17 182 views
0

我有一個主要的sqlite數據庫(大量的數據)和更新sqlite數據庫在我的android設備上。 (我喜歡更新的數據)。 我想更新main-db中的表與update-db中的表(相同結構)的數據與我的android應用程序。 - 表示刪除更新中存在的main中的所有行。 - 將所有內容從更新插入到main。通過附加數據庫更新sqlite表非常慢

我的做法,到目前爲止是:

attach db 'path to update' updatedb 
delete from mytable where id in (select id from updatedb.mytable) 
insert into mytable select * from mytable 

刪除和插入速度很慢(在我看來)。 有沒有辦法更快地做到這一點?

+0

位於服務器上的主數據庫? – icaneatclouds

+0

沒有這兩個數據庫的文件在Android設備的文件夾中。 –

+0

爲什麼不嘗試批量插入?它會大大減少插入時間.. – icaneatclouds

回答

0

使用批插入插入大量的數據。下面是代碼:

在你databaseHelper:

public void batchInsert(String sql, ArrayList<String[]> values) { 
    SQLiteDatabase db = getWritableDatabase(); 
    db.beginTransaction(); 

    SQLiteStatement stmt = db.compileStatement(sql); 
    for (int i = 0; i < values.size(); i++) { 
     String[] record = values.get(i); 

     for (int ii = 0; ii < record.length; ii++) { 
      stmt.bindString(ii + 1, record[ii]); 
     } 

     stmt.execute(); 
     stmt.clearBindings(); 
    } 

    db.setTransactionSuccessful(); 
    db.endTransaction(); 
    db.close(); 
} 

在你的活動:

ArrayList<String[]> dataBatch = new ArrayList<String[]>(); 
     int x = 0; 
     for (Data data : dataList) { 


      String[] dataArray = { data.getData1(),data.getData2(),data.getData2() }; 

      dataBatch.add(questionsArray);    

     } 

String sql = "INSERT INTO data "; 
     sql += "(data1, data2, data3) "; 
     sql += "VALUES (?,?,?)"; 

     DatabaseHelper dbhelper = new DatabaseHelper(context); 
     dbhelper.batchInsert(sql, dataBatch); 

基本上你對databaseHelper執行可以是不同的。但多數民衆贊成如何批量插入大量的數據。

+0

謝謝。我可以嘗試。但我有一些擔憂。我已經嘗試從rowb中逐行讀取數據並將它們插入事務中的maindb中。這比選擇從「選擇」更慢。我想這是數據庫幫助最後做了什麼? –

+0

是的,你應該預計它會變慢,因爲你在逐行進行(多個查詢)。批量插入,通過一個查詢插入多個記錄到MySQL中。所以你應該期待它更快。 另一方面,databasehelper只是一個具有數據庫操作功能的類。查詢,更新,刪除,批處理插入等,這取決於你的算法。 – icaneatclouds

+0

我不是一行一行的行,你可以在我的問題中看到。我只提到我也(另外)逐行測試了這個行,我預計它會和databaseHelper一樣。所以我想知道如果我真的獲得了更好的性能,因爲我的Statemant也是一個查詢。 –