1. ホーム
  2. android

[解決済み] Androidのバックアップ/リストア: 内部データベースのバックアップ方法

2023-05-20 11:07:17

質問

私は BackupAgentHelper を実装しました。 FileBackupHelper を使用して、私が持っているネイティブデータベースをバックアップおよびリストアします。これは、通常使用するデータベースと一緒に ContentProviders に存在するもので /data/data/yourpackage/databases/ .

これはよくあるケースだと思うでしょう。しかし、ドキュメントではどうすればよいのかが明確ではありません。 http://developer.android.com/guide/topics/data/backup.html . はありません。 BackupHelper は、これらの典型的なデータベースのために特別に用意されています。したがって、私は FileBackupHelper で私の .db ファイルを指し示し、" /databases/ を指定し、あらゆるdb操作のロックを導入しました。 db.insert のような) ContentProviders を作成し、さらに " /databases/ の前に " ディレクトリを作成しました。 onRestore() というディレクトリは、インストール後には存在しないためです。

私は同様の解決策を SharedPreferences に同様のソリューションを実装し、過去に別のアプリで成功しました。しかし、エミュレータ-2.2 で新しい実装をテストすると、バックアップの実行が LocalTransport にバックアップが実行され、ログから復元が実行されているのがわかります(そして onRestore() が呼び出される)。 しかし、dbファイルそのものは決して作成されません。

これはすべてインストール後であり、リストアが実行された後、アプリの最初の起動の前であることに注意してください。それとは別に、私のテスト戦略は http://developer.android.com/guide/topics/data/backup.html#Testing .

また、私が自分で管理している sqlite データベースや、SD カード、自分のサーバー、または他の場所へのバックアップについて話しているのではないことに注意してください。

私は、データベースに関するドキュメントで、カスタム BackupAgent を使用するよう助言しているデータベースについての記述を見ましたが、関連性はないようです。

しかし、必要であれば BackupAgent を直接拡張する必要がある場合があります。 * データベース内のデータをバックアップする。SQLite データベースがあり、それを SQLite データベースがあり、ユーザがアプリケーションを再インストールしたときに SQLite データベースがあり、ユーザがアプリケーションを再インストールしたときに復元したい場合 カスタムBackupAgentを構築する必要があります。 バックアップ操作中に適切なデータを読み取る バックアップ操作の間に適切なデータを読み取り、次に テーブルを作成し、リストア操作中にそのデータを挿入します。 リストア操作の間にデータを挿入します。

少しわかりやすくお願いします。

本当にSQLレベルまで自分でやる必要があるのなら、以下のようなトピックが心配です。

  • 開いているデータベースとトランザクション。私のアプリのワークフロー外のこのようなシングルトン クラスからそれらを閉じる方法がわかりません。

  • バックアップが進行中で、データベースがロックされていることをユーザーにどのように通知するか。長い時間がかかるかもしれないので、プログレスバーを表示する必要があるかもしれない。

  • リストア時に同じことをするにはどうしたらよいでしょうか。私の理解では、リストアは、ユーザーがすでにアプリを使い始めた(そしてデータベースにデータを入力した)ときに起こるかもしれません。そのため、バック アップされたデータをそのままリストアする(空または古いデータを削除する)ことはできません。何らかの方法でそれを結合する必要がありますが、id の関係上、トリビアルでないデータベースでは不可能です。

  • リストア完了後に、ユーザーを到達不可能なポイントで立ち往生させることなく、アプリをリフレッシュする方法。

  • バックアップまたはリストア時に、データベースがすでにアップグレードされていることを確認できますか? そうでなければ、期待されるスキーマが一致しないかもしれません。

どのように解決するのですか?

よりクリーンな方法としては、カスタム BackupHelper :

public class DbBackupHelper extends FileBackupHelper {

    public DbBackupHelper(Context ctx, String dbName) {
        super(ctx, ctx.getDatabasePath(dbName).getAbsolutePath());
    }
}

に追加し、それを BackupAgentHelper :

public void onCreate() {
    addHelper(DATABASE, new DbBackupHelper(this, DB.FILE));
}