1

androidシェルのみを使用して、データベースに最大200行を効率的に挿入する方法を探しています。

私が使用しているスクリプトの関連部分は次のとおりです。

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),toqry=$qry" ($uid, '$pkg', 0, 0, 0, 0, 0, 0),"
および/system/xbin/sqlite3 /mnt/sdcard/apps.db $qryto /system/xbin/sqlite3 /mnt/sdcard/apps.db "$qry;"
Echoing最後のコマンドは次のように表示されます:
/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

4

1 に答える 1

2

その2秒/行のほとんどは、コマンドが実行されるたびにsqliteの新しいインスタンスを起動し、その後終了するために費やされている可能性があります。したがって、すべての行を一度に追加するだけで、大幅な高速化を実現できます。

1つのSQLクエリに複数の行を挿入できるため、巨大な文字列をすべての挿入値と連結する方がよいでしょう。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(row 1 vals)、(row 2 vals)、(row 3 vals);」を使用しません。SQLiteではサポートされていないため、構文。

于 2012-12-27T23:08:58.430 に答える