Re: [問題] DB資料大筆且快速寫入Sqlite的方法

作者: lovelycateye (我還想要更多力量)   2016-04-21 06:21:36
→ ssccg: insert into XXXX values (…), (…), (…) … 04/20 17:16
→ ssccg: 要sqlite 3.7.11(通常是android 4.1)以上 04/20 17:17
→ ssccg: 應該有長度限制但是我不知道是多少,你可以例如一次一千筆 04/20 18:42
→ joedenkidd: insert into table(...,...,...) select * from xxx 04/20 21:07
→ joedenkidd: 這樣子試看看吧!不知道可不可行.... 04/20 21:07
要注意這種方式 Sqlite 有限制一次最多只能寫入 500 筆。
參考:http://www.sqlite.org/limits.html#max_compound_select
→ passli: 查詢 bulk insert 04/21 00:35
通常這種需求就 beginTransaction 下去開始一直寫就好了。
可以考慮用 prepared statement 再幫你加速,不需要每次 compile SQL statement。
可以參考看看這篇:
https://www.codeofaninja.com/2013/12/android-sqlite-transaction-tutorial.html
雖然我不知道你的需求和情況,不過如果…
- 資料不會變動,可以考慮直接先產生好 sqlite db 預載在程式內
- 資料比較長時間才變動一次,可以考慮 Server 預先產生好 sqlite db
再丟到網路空間去下載?例如 AWS S3 之類的,還可以用 CDN 幫你加速。
通常是先想想看有沒有辦法不要一直做這種一直大量寫入的事情,
逼不得已就是有這種需求才來想怎麼加速寫入。
作者: ssccg (23)   2015-04-20 17:16:00
insert into XXXX values (…), (…), (…) …要sqlite 3.7.11(通常是android 4.1)以上應該有長度限制但是我不知道是多少,你可以例如一次一千筆
作者: joedenkidd (優質的藍色射手)   2015-04-20 21:07:00
insert into table(...,...,...) select * from xxx這樣子試看看吧!不知道可不可行....
作者: passli   2015-04-21 00:35:00
查詢 bulk insert
作者: f814030 (f814030買者會視接單數量)   2016-04-21 09:25:00
感謝您的回覆,看了範例是在創建Sqlite時就寫入資料,不過小弟遇到的問題是,從Oracle資料庫Select出3萬筆資料,這時3萬筆資料應該是在記憶體裡面,目前是一筆一筆的寫入Sqlite,使用cv.put("xxx",aaa);db.insert("TableName", null, cv); 這種方式,時間秏時約30分鐘,所以才希望找更快的處理方式。亦感謝您提供這種教學,小弟亦有收獲,謝謝。
作者: bohei (run and fall)   2016-04-21 09:55:00
在外圈包了transaction還是需要30分鐘?
作者: f814030 (f814030買者會視接單數量)   2016-04-21 15:37:00
是的,我外層有用beginTransaction(); 和setTransactionSuccessful()包起來,但還是需要30分鐘。
作者: givemepass (λ)   2016-04-21 16:17:00
感謝貓神分享!
作者: drdsmile (smile D)   2016-04-22 17:01:00
有學到有推~~ 感謝
作者: lovelycateye (我還想要更多力量)   2016-04-26 13:51:00
才3萬筆寫30分鐘,你要不要看一下我丟的連結?沒意外應該是你的 transaction 包的範圍不對

Links booklink

Contact Us: admin [ a t ] ucptt.com