Why do I get a "sqlite3: not found" error on a rooted Nexus One when I try to open a database using the adb shell?

Jul*_* A. 45 sqlite shell android adb rooted-device

# sqlite3 /data/data/com.moodme.android/databases/moodme
sqlite3 /data/data/com.moodme.android/databases/moodme
sqlite3: not found
Run Code Online (Sandbox Code Playgroud)

eve*_*otc 93

作为替代方案(虽然可能不安全或甚至不是好主意)但您总是可以将sqlite3二进制文件上传到/system/bin我的工作中:

首先让mount /system/允许读/写(rw)

$ adb shell
$ su
# mount -o remount,rw /system
Run Code Online (Sandbox Code Playgroud)

在另一个终端更改目录(cd)到哪里sqlite3,然后让它推送它

$ ls
sqlite3
$ adb push sqlite3 /sdcard/
Run Code Online (Sandbox Code Playgroud)

现在回到另一个shell,我们可以复制和更改二进制文件的权限

# cat /sdcard/sqlite3 > /system/bin/sqlite3
# chmod 4755 /system/bin/sqlite3
Run Code Online (Sandbox Code Playgroud)

现在让我们/system/以只读方式挂载(ro)

# mount -o remount,ro /system
Run Code Online (Sandbox Code Playgroud)

现在我们可以从shell使用sqlite3:

# sqlite3 /data/data/com.telly/databases/fun.db
SQLite version 3.7.4
Enter ".help" for instructions
sqlite> .tables
android_metadata  lulz               
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是"SuperOneClickv1.6.5-ShortFuse"附带的sqlite3二进制文件

您始终可以sqlite3从模拟器中提取二进制文件:

启动模拟器,然后从终端启动

$ adb pull /system/xbin/sqlite3
Run Code Online (Sandbox Code Playgroud)

如果你像我一样懒,你可以在这里下载一个ICS或之前或者为Jelly Bean而在这里下载

请确保在您的Android版本中使用正确的版本eloc_library[1306]: 14446 cannot locate 'sqlite3_enable_load_extension'...或执行时出现类似的错误


Com*_*are 21

在Android模拟器上,sqlite3/system/xbin.有没有/system/xbin在歌Nexus One(Android 2.2的).因此,我怀疑sqlite3Nexus One上没有安装.

  • @Julian:"但设备是否需要它来创建和读取sqlite3数据库?" - 为什么会这样?SQLite是一个库,通过JNI附加到Android应用程序.`sqlite3`是一个命令行可执行文件."而且,如果它不在Nexus One上,有没有办法让它在那里?" - 欢迎您尝试查找ARM端口,看看是否可以正常工作.不过,我怀疑它是你认为自己遇到的任何问题的解决方案.Android应用不需要它.对于开发,您可以从已植根的电话中提取数据库并在开发计算机上进行检查. (3认同)
  • @Julian:在模拟器上,没有.在设备上,是,root或不.此外,如果您是Eclipse用户,您可能想要查看适用于Android的MOTODEV Studio.我似乎记得他们有一个用于on-emulator数据库的集成SQLite编辑器,这可能适用于你的root电话.在幕后,它可能只是拉动,但它可能更方便. (3认同)

jia*_*hao 12

从evelio的答案来看,我有问题将sqlite3文件推送到/ system/bin.所以,相反,我把它推到了/ SD卡.

在这个帖子中,我找到了正确的解决方案(Kila的答案): 如何在root用户的NexusOne上安装sqlite3运行Gingerbread

$ adb push sqlite3 /sdcard/
$ adb shell
$ su
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
# dd if=/sdcard/sqlite3 of=/system/bin/sqlite3
# chmod 4755 /system/bin/sqlite3
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system 
Run Code Online (Sandbox Code Playgroud)

它适用于我的三星Galaxy S II 2.3.3.


Jer*_*Kao 5

要在非 ROOTED 设备上安装 sqlite3,这里有一种已被证明适用于我的 Galaxy S3,FYR 的方法。

$ adb -e pull /system/xbin/sqlite3  # get sqlite3 binary from emulator with the same CPU arch.
$ adb -d push sqlite3 /mnt/sdcard   # push it
$ adb -d shell
$ run-as <PACKAGE_NAME>             # run as your app, which should be debuggable.
$ cd databases; pwd
/data/data/<PACKAGE_NAME>/databases
$ cat /mnt/sdcard/sqlite3 > sqlite3 # copy it to internal storage directory
$ ls -l sqlite3
-rw-rw-rw- u0_a138  u0_a138     36860 2014-03-26 06:37 sqlite3
$ chmod 777 sqlite3                 # change mode bits, to be executable

$ ./sqlite3                         # now it works on your NON-ROOTED device
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
Run Code Online (Sandbox Code Playgroud)

  • 还试图在无根 4.4 设备上使其工作。您的步骤几乎可以正常工作,只是在使用 run-as 后,应用程序用户帐户不再具有 /mnt/sdcard 权限(用于在较旧的 Android 版本中工作;必须是最近的更改)。我通过将 sqlite3 二进制文件放在应用程序资产文件夹中,然后在第一次运行应用程序时将其解压缩到数据库文件夹来解决该部分。 (3认同)

归档时间:

查看次数:

69942 次

最近记录:

9 年,6 月 前