步骤1:通过Windows资源管理器将我的SQLite数据库从Windows 7复制到平板电脑。 步骤2:在平板电脑上打开它(这会添加android_metadata表),然后关闭它。 步骤3:将SQLite数据库复制回Windows。 步骤4:使用sqlite3.exe检查它。 它已损坏。
现在是另一个测试。
步骤1:通过Windows资源管理器将我的SQLite数据库从Windows 7复制到平板电脑。 步骤2:断开连接,然后重新连接USB电缆。 步骤3:在平板电脑上打开它(这会添加android_metadata表),然后关闭它。 步骤4:将SQLite数据库复制回Windows。 步骤5:使用sqlite3.exe检查它。 它没有损坏。
有趣的是,如果我交换步骤2和3,它也可以工作。
由于当我断开并重新连接USB电缆时它可以正常工作,因此我猜想我需要以某种方式清除MTP缓存。 如何实现这一点,或者是否有API可以用来快速断开和重新连接设备?
我的实际Windows应用程序使用WPD(Windows便携式设备)API,我只是使用Windows资源管理器进行测试,以证明这不是我的Windows代码的问题。 我在WPD中没有看到任何可以执行清除操作的内容。
当Android上的SQLite数据库增加一页(或更多)时,错误似乎会发生。 SQLite中的页面大小为512字节。 查看SQLite数据库的二进制数据,我可以看到发生了什么。 我在设备上使数据库变大一页,将数据库复制到设备外,拔掉USB电缆,重新插入它,然后再次复制它。 比较两个文件,我得到的文件与上次复制文件时相同,只是在结尾处有更多的数据。 看起来MTP在你拔下USB电缆并重新插入之前不会理解文件变大。 如果你让USB保持连接状态,它只会复制上次复制文件时的字节数。