2012-12-27 45 views
1

我正在尋找一種方法來高效地在數據庫中插入〜200行,僅使用android shell。從android外殼插入數據庫行的有效方法?

我使用的腳本的相關部分是:

while read line 
do 
    uid=`echo $line " awk '{print($2)}'` 
    pkg=`echo $line " awk '{print($1)}'` 
    /system/xbin/sqlite3 /mnt/sdcard/apps.db "INSERT INTO app_list values($uid, '$pkg', 0, 0, 0, 0, 0, 0) 
done < /data/system/packages.list 

這個腳本的目的是生成一個包含所有安裝的應用程序(UID /包的名稱)的列表的數據庫。其他列將在稍後使用。

對於大約200個應用程序,該腳本需要幾分鐘時間:每個sqlite命令需要大約2秒鐘才能執行。這應該通過使用交易得到很大改善,但是我沒有看到明確的方式來做到這一點。

任何幫助將不勝感激,

謝謝。

編輯:

針對帖子#1:
更改:
qry=$qry ($uid, '$pkg', 0, 0, 0, 0, 0, 0),qry=$qry" ($uid, '$pkg', 0, 0, 0, 0, 0, 0),"
/system/xbin/sqlite3 /mnt/sdcard/apps.db $qry/system/xbin/sqlite3 /mnt/sdcard/apps.db "$qry;"
呼應的最後一個命令顯示:
/system/xbin/sqlite3 /mnt/sdcard/apps.db INSERT INTO app_list VALUES (10028, 'com.google', 0, 0, 0, 0, 0, 0), (10048, 'com.google.something', 0, 0, 0, 0, 0, 0), ... (10062, 'com.google.somethingelse', 0, 0, 0, 0, 0, 0);
這似乎是正確的,但執行時輸出以下錯誤:
SQL error: near ",": syntax error

+0

你可以嘗試連接所有用分號分隔的INSERT並一次全部傳遞它嗎? – PinnyM

+0

您可以通過awk腳本運行輸入文件以創建一批插入語句(如果是tmp文件),然後將該tmpfile重定向到sqllite3(在頂部和底部有任何所需的額外內容)。祝你好運。 – shellter

回答

2

大部分每秒2秒的時間可能是在每次命令運行和退出之後啓動一個新的sqlite實例,因此您可以通過添加所有行來獲得很多加速一旦。

您可以insert multiple rows in a single SQL query,所以它可能會更好地concavonate巨大的字符串與所有的插入值。 bash腳本看起來像這樣。

qry="" 
while read line 
do 
    uid=`echo $line " awk '{print($2)}'` 
    pkg=`echo $line " awk '{print($1)}'` 
    qry="$qry INSERT INTO app_list VALUES ($uid, '$pkg', 0, 0, 0, 0, 0, 0);" 

done < /data/system/packages.list 

/system/xbin/sqlite3 /mnt/sdcard/apps.db "$qry;" 

編輯:

爲了澄清,這個腳本使用 「INSERT INTO TBL VALUES(行1個瓦爾斯),(行2個瓦爾斯),(行3個瓦爾斯);」語法,因爲它不受SQLite支持。

+0

感謝您的回答。我稍微修改了它並嘗試了一下,但它給我提供了一個語法錯誤,即使一切看起來都正確。 請參閱編輯的詳細信息。 – GermainZ

+0

好吧 - 所以經過研究,顯然Sqlite不支持一個insert-statement中多個值的語法。我已經修改了示例腳本來生成一堆插入語句。不過,它應該仍然可以節省大量的執行時間,因爲只需要打開一次sqlite。 –

+0

好吧,它現在正確執行。 執行時間幾乎相同(公平起見,我認爲它從大約3-4米下降到大約1.5米,但從屏幕超時和我的記憶來看,這只是一個印象)。不過,我現在可以輕鬆添加BEGIN;到開始和COMMIT;到命令的末尾,這會讓事情變得更快(大約5秒,實際的sqlite命令是瞬間的): '/ system/xbin/sqlite3 /mnt/sdcard/apps.db「BEGIN; $ qry; COMMIT; 「' – GermainZ

相關問題