1

我正在寻找一种在数据库中有效插入约 200 行的方法,专门使用 android shell。

我正在使用的脚本的相关部分是:

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:
Changed:
qry=$qry ($uid, '$pkg', 0, 0, 0, 0, 0, 0),to qry=$qry" ($uid, '$pkg', 0, 0, 0, 0, 0, 0),"
and /system/xbin/sqlite3 /mnt/sdcard/apps.db $qryto /system/xbin/sqlite3 /mnt/sdcard/apps.db "$qry;"
Echoing the last command shows:
/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 实例,因此只需一次添加所有行即可获得很多加速。

您可以在单个 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 回答