我正在寻找一种方法,可以有效地在数据库中插入~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篇文章:
更改:
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 :(得分:2)
每行2秒的大部分时间可能用于在每次命令运行和退出之后启动sqlite的新实例,因此只需一次添加所有行就可以获得大量的加速
你可以insert multiple rows in a single SQL query,所以用一个包含所有插入值的巨大字符串连接起来可能会更好。 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行vals),(第2行vals),(第3行vals);”语法,因为SQLite不支持它。