SamsungGalaxyAndroidタブレットをUSBケーブルでWindows7を実行しているコンピューターに接続します。MTPを使用して接続します。
- ステップ1.Windowsエクスプローラーを介してWindows7からタブレットにSQLiteデータベースをコピーします。
- 手順2.タブレットで開き(android_metadataテーブルが追加されます)、閉じます。
- ステップ3.SQLiteデータベースをWindowsにコピーして戻します。
- ステップ4.sqlite3.exeを使用して確認します。壊れています。
今度は別のテスト。
- ステップ1.Windowsエクスプローラーを介してWindows7からタブレットにSQLiteデータベースをコピーします
- 手順2.USBケーブルを取り外してから再接続します。
- 手順3.タブレットで開き(android_metadataテーブルが追加されます)、閉じます。
- ステップ3.SQLiteデータベースをWindowsにコピーして戻します。
- ステップ4.sqlite3.exeを使用して確認します。破損していません。
興味深いことに、手順2と3を切り替えると、それも機能します。
USBケーブルを外して再接続すると動作するので、どういうわけかMTPキャッシュをフラッシュする必要があると思います。これをどのように達成できますか、またはデバイスをすばやく切断して再接続するために使用できるAPIはありますか?
私の実際のWindowsアプリケーションはWPD(Windows Portable Devices)APIを使用しています。Windowsエクスプローラーを使用してテストしているだけで、Windowsコードに問題がないことを証明しています。フラッシュを実行するためのWPDには何も表示されません。
このエラーは、Android上のSQLiteデータベースが1ページ(またはそれ以上)大きくなると発生するようです。SQLiteのページサイズは512バイトです。SQLiteデータベースのバイナリデータを見ると、何が起こっているのかがわかります。デバイス上でデータベースを1ページ大きくし、データベースをデバイスからコピーし、USBを取り外し、プラグを差し込んでから、もう一度コピーします。2つのファイルを比較すると、usbデータをコピーした後に取得するファイルは、最後に多くのデータがあることを除いて同じです。USBを取り外して再度接続するまで、MTPはファイルが大きいことを理解しないようです。USBを接続したままにすると、最後にファイルをコピーしたときに存在していたバイト数だけがコピーされます。