2015-06-12 32 views
1

在我目前的Android項目中,我正在開發一個應用程序,用於記錄通信數據。每個數據包都存儲在我的SQLite數據庫中的一行中。我的一個測試錄音有3.888.530行。如何從SQLite中讀取4百行代碼並將其快速寫入文件?

應用程序應支持導出功能,以JSON格式將此數據寫入文本文件。目前我正在使用LIMIT函數,讀取5.000行的包並將它們寫入文件。這真的很慢。我認爲從數據庫讀取15.000行並將它們寫入文件需要超過60秒。

用於書寫我正在使用PrintStream。一個字符串被創建並且轉換爲一個字節數組被賦予流。

我讀我的數據包,這個查詢:

SELECT * 
FROM data_packet 
INNER JOIN data_packet_type 
    ON data_packet.data_packet_type_id = data_packet_type.id 
WHERE recording_id = 7 
ORDER BY time_received ASC 
LIMIT 5000 OFFSET 0 

的查詢與調用執行:

db.rawQuery(query, null); 

後來,我通過與光標的運行數據和存儲數據。

我希望有一種方法可以更快地導出數據。 謝謝。

+0

只讀了他們全部,而不是在大塊 – pskink

+0

60秒?這是非常緩慢的,你一定是做錯了什麼。從數據庫中獲取15k條記錄最多需要幾百毫秒。可能小於100. –

+0

使用Traceview來確定問題出在哪裏。你似乎認爲它來自查詢;我的猜測是它來自您的磁盤寫入I/O的JSON。 – CommonsWare

回答

2

我想,你真的應該放棄LIMIT函數。

通過使用LIMIT/OFFSET,您可以強制數據庫一遍又一遍地重複讀取相同的行塊,特別是當您使用ORDER BY和/或JOINS時。

另一個問題,我想想(當我有數據庫方案)是如果你真的需要加入。對我而言,它看起來可以避免,但是當然數據庫可以優化JOIN,我不能說沒有一個方案或者一個EXPLAIN。

如果這沒有幫助,我會建議在沒有寫入的情況下進行閱讀,所以您可以看到,如果您的數據庫或寫入限制在本例中(如Robert所示,PrintStream可能對寫作不利 - 寫入大量數據時,寫入很慢)。

但沒有db方案和信息,如果讀取或寫入是問題,更好的答案真的很難!

+0

如何測量查詢所需的時間? – tellob

+0

只需刪除書寫部分(只做查詢)並按照以前的方式進行測量。 – Juergen

+0

通過遊標運行? – tellob

相關問題