30

Android アプリケーションのデータベース ディレクトリ (/data/data/com.me.myApp/databases) には、作成するすべての sqlite データベースに対して、名前に「-journal」が追加された同じ名前の対応するデータベースがあります。

例: myDatabase、myDatabase-journal、myOtherDatabase.db、myOtherDatabase.db-journal

これは何ですか?

と、

アプリに事前に入力されたデータベースを提供している場合 ( http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/に従って) を含める必要がありますか?これらも?

4

3 に答える 3

32

このような-journalファイルは配布する必要はありません (配布すべきではありませ)。

これは、さまざまなジャーナル ファイルが、SQLite によって使用される一時データ( SQLite の一時ディスク ファイルの使用を参照)を表しているためです。特に、-journalファイルはロールバック ジャーナルです。

ロールバック ジャーナルは、SQLite でアトミック コミットおよびロールバック機能を実装するために使用される一時ファイルです。(これがどのように機能するかの詳細については、SQLite の Atomic Commit というタイトルの別のドキュメントを参照してください。) ロールバック ジャーナルは常にデータベース ファイルと同じディレクトリにあり、8 文字を除いてデータベース ファイルと同じ名前です。 -ジャーナル」を追加。

ロールバック ジャーナルは、通常、トランザクションが最初に開始されたときに作成され、通常、トランザクションがコミットまたはロールバックされるときに削除されます。ロールバック ジャーナル ファイルは、SQLite のアトミック コミットおよびロールバック機能を実装するために不可欠です。ロールバック ジャーナルがないと、SQLite は不完全なトランザクションをロールバックできず、トランザクションの途中でクラッシュまたは電源喪失が発生した場合、ロールバック ジャーナルがないとデータベース全体が破損する可能性があります。

一般に、これらの-journalファイルは、開いている SQLite データベース (または実行中のトランザクション) がある場合にのみ存在する必要がありますが、 PRAGMA journal_modeを介して制御できます。デフォルトのプラグマ設定では、-journalファイルは削除されます。

DELETE ジャーナリング モードは通常の動作です。DELETE モードでは、ロールバック ジャーナルは各トランザクションの終了時に削除されます。実際、削除操作は、トランザクションをコミットさせるアクションです。

データベースが開かれておらず、すべてのジャーナルが SQLite 自体によって削除 (またはクリア) されている場合にのみ、実際のデータベース ファイルのみをコピーしてください。これは、すべてのトランザクションが完了し、データベースが一貫した状態にあることを意味します。

于 2014-10-06T01:54:11.400 に答える
0

これで問題は解決しましたか?Android デバイスからローカル マシンにコピーしたい .db をコピーできない場合があります。.db を正常にコピーするには、デバイス上の -journal を手動で削除する必要があります。これはC#で書かれた私のコードです

var devices = MediaDevice.GetDevices();
using (var device = devices.First(d => d.Description == "PM67"))
{
    device.Connect();
    var photoDir = device.GetDirectoryInfo(@"\Internal Shared Storage\Databases");

    var files = photoDir.EnumerateFiles("database.db", SearchOption.AllDirectories);

    foreach (var file in files)
    {
        MemoryStream memoryStream = new System.IO.MemoryStream();
        device.DownloadFile(file.FullName, memoryStream);
        memoryStream.Position = 0;

        try
        {
            device.DeleteFile(@"\Internal Storage\Databases\database.db-journal");//this is the part where I'd like to delete the -journal but it's not working
        }
        catch
        {
        }

        try
        {
            if (File.Exists(result) == true)
            {
                File.Delete(result);
            }
        }
        catch
        {
        }
        WriteSreamToDisk(result, memoryStream);
    }
    device.Disconnect();
}
于 2021-11-26T01:06:21.547 に答える