我创建了一个与 sqlite3
database.db
文件连接的 Kivymd 应用程序。我用 buildozer
编译了它,它成功地工作得很好,当我看到 buildozer 是如何工作的时,数据库文件看不到。 但这是第一次测试,应用程序的最终应用需要将database.db文件从PC传输到手机,所以我将其放在手机的Download文件夹中,并在python脚本中编辑了路径。现在我不断收到sqlite3.OperationalError:无法打开数据库文件。这让我走上了一条更好地理解adb
的道路,以root身份运行adb shell
,遗憾的是我的手机是生产版本,我不能指望每个使用该应用程序的人都能root他们的手机。我尝试过不同的路径。
storage/self/primary/Download/database.db
sdcard/Download/database.db
storage/emulated/0/Dowload/data.db
因为数据库将在PC上创建然后传输到手机,所以我将其复制到SD卡并运行
$ adb shell
和
$ ls -lah
我看到手机如何将SD卡链接到
sdcard -\> /storage/self/primary
,我相信这就是不允许应用程序读取文件的原因,因为我什至无法使用adb评估它,因为我不能adb root
。
chmod 777 database.db
不更改任何权限。
我也尝试过(因为我的adb无法运行
sudo
或su
)
chown everbody database.db
usermod -a -G database.db everybody
chmod u+w+x,g+w+x database.db
更改任何权限仍然没有成功。
在哪里或如何将此文件复制到此手机,以便应用程序只需将 PATH 的正确位置放入 Python 脚本即可轻松对其进行评估? 安卓手机确实存在很多权限问题。
我也已经成功使用过:
if platform == 'android':
from android.permission import Permission, request_permissions, check_permissioin
request_permission([Permisssion.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE])
在加载闪屏后成功弹出的脚本顶部,我点击允许,这样工作正常,但之后仍然出现 sqlite 错误并且应用程序崩溃。 当我卸载该应用程序时,我发现确实授予了权限,因此这不可能是权限问题。
我使用的手机是Samsung Galaxy A02,运行Android 11,我还使用Arch Linux x86_64 lts内核和VSCode IDE
好的,我已经解决了。感谢@Lino 的回答。我只需复制它:
$ adb push database.db /data/local/tmp
然后:
$ adb shell run-as org.test.app_name cp /data/local/tmp/database.db files/app
然后将 python 脚本中的路径更改为“database.db”。
副本可以通过以下方式确认:
$ adb shell
$ run-as org.test.app_name
$ cd files/app
$ ls
所有这些都是必需的,因为我有一部生产手机并且无法获得 root 访问权限。