通过adb shell
箭头键使用 sqlite3 时,不是将光标移动到所需位置或调用历史工具,而是在屏幕上显示以下内容:^[[A
, ^[[B
, ^[[C
, ^[[D
。
我正在使用 Mac OS X,并且我尝试过Terminal和iTerm终端仿真器。
有人知道如何解决这个问题吗?
为了允许在控制台程序的输入中进行编辑和历史记录,该程序必须与readline
库链接。
该sqlite3
工具确实支持 readline,但在 Android 上,readline 支持已被禁用。(可能是因为 readline 仅在 GPL 下获得许可。)
一种解决方法是使用具有 readline 支持的本地版本的 SQLite。
将数据库文件从您的设备复制到本地计算机:
adb pull <database-file-on-device>
使用本地版本的 SQLite 访问数据库文件:
sqlite3 <database-file-on-local>
如果您进行了更改,您可以将它们传输到设备。将本地数据库文件从本地计算机复制到设备:
sqlite3 <database-file-on-local> <database-file-on-device>
您可以在 adb shell 中使用之前的命令功能。所以只是 adb shell。然后 cd 到 /data/data//databases 目录。从这里运行(例如): sqlite3 "select * from "
然后您可以使用向上箭头来重做该命令。有点 hack,但比在 sqlite3 交互式提示中重新键入命令要好得多。
根据 Khanad 的回答:我在设备上编写了一个 shell 脚本,并通过它发送我的 sqlite 命令。
首先在设备上创建一个脚本文件并使其可执行:
# get on the device
$ adb shell
# get write access on the device (this will also put you in the data/data directory)
$ run-as com.YOUR_PACKAGE.YOUR_APP_NAME
# create the script file
$ touch qlite
# make it executable
$ chmod +x qlite
然后将此代码添加到脚本中。请记住将您的实际应用名称放在那里。(回声只是为输出增加了一点喘息的空间。)
echo
sqlite3 databases/YOUR_APP_NAME -cmd ".mode column" ".headers on" "$1;"
echo
然后你只需要做类似的事情:
./qlite "select * from table limit 1"
该脚本将传递 sqlite 命令,添加分号,用列名漂亮地打印它,您可以使用向上箭头获取最后一个命令。由于您具有写入权限,因此您可以直接对设备上的数据库进行更新。
我希望这能让某人的生活更轻松!
使用 ADB shell 代替 sqlite3 shell 以获得 readline 包的优势。
generic_x86:/data/data/com.example.musicplayer/databases $ sqlite3 music_player_database -line 'select * from lastplayedsong;'
只要确保您在正确的包中并且不要将.db放在数据库名称的末尾,否则将创建一个新数据库并且查询将不会返回任何结果。
PS:来源