我正在寻找一种在数据库中高效插入约 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 错误:靠近“,”:语法错误
最佳答案
每行 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 (row 1 vals), (row 2 vals), (row 3 vals);”语法,因为 SQLite 不支持它。
关于android - 从 android shell 向数据库中插入行的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14061874/