1

我正在尝试开发一个将使用外部创建的 SQLite 数据库的 Android 应用程序。所需的应用程序运行周期如下:

  1. 数据库会定期(每天)在外部(Windows 桌面)机器上重新创建并填充数据(来自另一个数据库)。
  2. 然后将该数据库通过 USB 或 WIFI 推送到 Android 设备中。
  3. 新推送的数据库用于在 Android 设备上输入新数据。输入的记录被标记(以将它们与现有记录区分开来)。
  4. 最终,数据库从 Android 设备拉回 Windows 桌面计算机(此过程需要由 Windows 应用程序启动,而不是由 Android 应用程序启动)。
  5. 新的(标记的)记录从 Windows 桌面上的 SQLite 数据库中提取、验证并添加到主 Windows 桌面数据库中。
  6. 然后将更新后的完整桌面数据库复制到新的 SQLite 数据库中,最后将其推回 Android 设备(参见第 1 点和第 2 点)。

笔记:

  1. 项目清单
  2. Android 应用程序无法在 Android 设备上创建 SQLite 数据库。
  3. 将外部创建和填充的数据库放在 apk 的 assets 目录中是不可行的,因为这仅适用于初始应用程序安装,并且无法满足日常数据库推/拉例程的关键要求。
  4. 从 Web 服务器存储/导入 SQLite 数据库是不可行的,因为用户在使用此应用程序时通常无法访问互联网,即 SQLite 数据库推/拉过程需要在连接到独立的 Android 上完成Windows 机器通过 USB 或 WIFI。
  5. 首选是从 Android 内部存储区域(或 SDCard)存储和访问数据库,但在隐藏/受保护的内部根存储部分之外,即不在 /data/data/package_name/databases/ 中,以便为用户提供可以免费访问存储在 Android 设备上的数据库文件。
  6. 关键障碍似乎是 Android 应用程序对外部创建、推送的数据库的识别。我通过将应用程序创建的数据库文件复制到不同的文件夹(仍在 data/package_name/.. root 部分中)然后将其复制回 ../databases/ 文件夹来测试它。这足以扰乱应用程序对数据库的访问:尽管尝试打开相同的未更改的数据库文件,但我会收到“打开跟踪文件时出错:没有这样的文件或目录 (2)”。我想,这个限制是由于 Android 的“沙盒”文件安全保护?

如何克服上述数据库复制/推/拉问题以及如何实现这个所需的数据库访问推/拉模型?

4

1 回答 1

1

如果您需要 USB,ADB会为您完成。

adb push <local db> <android db>

adb pull <android db> <local db>

例如:

adb push database.db /sdcard/mypath/database.db
adb push /sdcard/mypath/database.db database.db

您还可以让 Windows 机器从 Android 设备中删除数据库,如下所示:

adb shell rm /sdcard/mypath/database.db

此外,您可以使用 adb 启动活动或广播意图,以便您可以告诉应用程序在拉动数据库之前关闭数据库并退出。

如果 Wifi 是一个选项(更好的选项),有多种方法可以通过 wifi 访问 android 设备上的数据:

  • NanoHTTPd仅使用单个 .java 文件将设备变成网络服务器。
  • jCIFS允许 Android 设备访问 Windows 共享。
于 2013-02-02T06:34:43.197 回答