4

我使用 USB 电缆将三星 Galaxy Android 平板电脑连接到运行 Windows 7 的计算机。它使用 MTP 连接。

  • 步骤 1. 通过 Windows 资源管理器将我的 SQLite 数据库从 Windows 7 复制到平板电脑。
  • 步骤 2. 在平板电脑上打开它(添加 android_metadata 表),然后关闭它。
  • 步骤 3. 将 SQLite 数据库复制回 Windows。
  • 步骤 4. 使用 sqlite3.exe 检查它。这是腐败的。

现在进行另一个测试。

  • 步骤 1. 通过 Windows 资源管理器将我的 SQLite 数据库从 Windows 7 复制到平板电脑
  • 步骤 2. 断开然后重新连接 USB 电缆。
  • 步骤 3. 在平板电脑上打开它(添加 android_metadata 表),然后关闭它。
  • 步骤 3. 将 SQLite 数据库复制回 Windows。
  • 步骤 4. 使用 sqlite3.exe 检查它。它没有腐败。

有趣的是,如果我切换步骤 2 和 3,它也可以工作。

由于它在我断开并重新连接 USB 电缆时起作用,我猜我需要以某种方式刷新 MTP 缓存。这是如何实现的,或者是否有一个 API 可以用来快速断开和重新连接设备?

我实际的 Windows 应用程序使用 WPD(Windows 便携式设备)API,我只是在使用 Windows 资源管理器进行测试,以证明它在我的 Windows 代码中没有问题。我在 WPD 中看不到任何可以刷新的内容。

当 Android 上的 SQLite 数据库增长一页(或更多)时,似乎会发生该错误。SQLite 中的页面大小为 512 字节。查看 SQLite 数据库的二进制数据,我可以看到发生了什么。我在设备上使数据库大一页,将数据库从设备上复制下来,拔下 USB,插入,然后再次复制。比较这两个文件,我复制usb数据后得到的文件是一样的,只是最后有更多的数据。就像 MTP 不知道文件更大,直到您拔下 USB 并重新插入。如果您将 USB 插入其中,它只会复制上次复制文件时的字节数。

4

2 回答 2

0

使用此 DELPHI 示例所示的窗口功能。


程序 shCopyFile(hWndOwner: HWND; const SourceFile, TargetFile: string);

变量信息:TSHFileOpStruct;
中止:布尔;

开始
中止:=假;

使用信息
开始
Wnd := hWndOwner;
wFunc := FO_COPY;

// 来自 Microsoft 的帮助:
// wFunc = 要执行的操作。该成员可以是下列值之一:
// FO_COPY 将 pFrom 指定的文件复制到 pTo 指定的位置。
// FO_DELETE 删除由 pFrom 指定的文件(忽略 pTo)。
// FO_MOVE 将 pFrom 指定的文件移动到 pTo 指定的位置。
// FO_RENAME 重命名 pFrom 指定的文件。

pFrom := pChar(SourceFile);
pTo := pChar(目标文件);
fFlags := 0;
fFlags := FOF_SILENT 或 FOF_NOCONFIRMATION 或 FOF_NOERRORUI;
fAnyOperationsAborted := 中止;
结尾;
尝试
SHFileOperation(Info);
最后
如果中止则;在任何用户取消
结束时制定;
结尾;

我正在将文件从桌面复制到 Android MTP 设备 PATH

Stefano www.data-ware.it

于 2012-03-10T15:27:22.990 回答
0

我在三星 Galaxy Tab 2 7.0 上发现了完全相同的问题。

但在我看来,这是android方面的问题。

如果我强制打开数据库的应用程序停止(系统设置->应用程序管理器->我的应用程序->强制停止),那么它可以工作。

只有“打开连接”和“关闭连接”是不够的。android端的完整进程必须关闭。

这解释了为什么它在重新启动设备后工作。


进一步调查:它与 Galaxy Tab 和 4.1.2 完美配合(如果 App-process 已关闭)。它适用于 MTP,但不适用于 PTP(图片传输协议)。两种协议都与 WPD 功能连接,但 PTP 在写入和读取时非常不一致(因此永远不要使用 PTP)。

于 2013-04-18T12:34:13.967 回答