0

短い形式での質問:フォローアップから、質問の核心を強調して単純化する必要があるようです。核心は次のとおりです。Android DB の他のバックアップ オプションでは、現在データベースにあるデータが復元によって上書きされる可能性があるというリスクが残っているようです。これはそうですか、このリスクなしでバックアップ/復元する方法はありますか?

.

長い形式の質問: Android で SQLite データベースをバックアップすることに関する多くの (かなり多数の) 質問に目を通しましたが、答えが見つからない質問が 1 つあります。

他のすべてのバックアップ/復元の説明では、db ファイルを SD に保存し (または、Android で SQLite データベースを Dropbox にバックアップ/復元する方法でクラウドに)、必要に応じて復元することについて説明しました。私の懸念は、復元によって現在の DB が上書きされないかということです。

ユーザーが短時間使用していたアプリを新しくインストールし (新しいデータを生成)、アプリの以前のバックアップからデータをインポートしたい場合が心配です。他のすべてのバックアップ/復元アプローチでは、古い DB ファイルを復元すると、現在の DB ファイル内の新しいデータが上書きされるようです。代わりに欲しいのは、復元時にバックアップから現在のDBにデータを追加して、その中の他のものを上書きせずに完全にするバックアップオプションです。

他のアプローチはこれを行いますか?それとも、私が疑うように、そのような場合に上書きしますか?

彼らが上書きする場合、私の最善のバックアップオプションはおそらくcsvまたはxmlファイルなどに書き出すことであり、これらのバックアップの議論はそれを行う簡単な方法についてのものであると思っていました. そのプロセスを高速化して簡単にするために構築されたプロセスはありますか、それともすべて手動で行う必要がありますか? もしそうなら、書き込むフォーマットに関する推奨事項とその理由は?

同様に、BackupAgentHelper を使用した組み込みの Google バックアップで同じ上書きの問題が発生するかどうかを知っている人はいますか?

最後に、データ移行 (コア データ モデルが変更された後にバックアップから SQLite データベースを復元する方法 (軽量移行) に似ています) を経てしまった場合、今何をすべきか (私はまだ DB 設計段階にあります) ) このような将来の変更を、このバックアップ プロセスと比べて容易にする方法はありますか?

4

2 に答える 2

0

「新しい」データを変更(または競合)せずに古いデータを復元する問題は、あなたが説明したシナリオでは解決するのがそれほど難しくないと思います。基本的に、古いデータが新しいデータと論理的な競合を持たないという前提で、古いデータ (レコード) を新しいデータベースに「追加」したいだけのようです (つまり、新しいデータベースのために新しいレコードを作成することは意味的に問題ありません)。古いデータ)。復元中の主キーの競合に対処することが、考慮すべき最も重要な問題になると思います。

次の 2 つのケースを考えてみましょう。

1: データベースの主キー値の自動生成機能を使用しています (たとえば、SQLite テーブルの AUTOINCREMENT 列を使用しています)。

復元プロセスが開始される前に、「新しい」データベース レコードが 1 ~ 10 の主キー (ROWID) 値を使用していた可能性があると仮定します。これらの主キー値 (1 から 10) のいずれかを持つ「古い」データベース レコードがある場合、それらの古い主キー値を保持したい場合にのみ問題が発生します。この問題を回避するには、「古い」レコードの「古い」主キー値を保持しないでください。「古い」データベースからレコードを読み取った後、「古い」レコードの他の属性 (列) の値を保存するだけです。データベースがこの「復元された」レコードの新しい主キー値を生成するようにします。基本的に、「古い」レコードは新しい主キー値で保存されます。この「復元」プロセスの後、レコードの時系列の順序を維持することに懸念がある場合は、

2: 主キーの値を生成するために別のメカニズム (UUID、シーケンス ジェネレーターなど) を使用しています。

この場合、「古い」レコードを読み取り、それを「新しい」データベースに保存する前に、「古い」主キー値を代替メカニズムで生成された主キー値に置き換えます。既存の「新しい」レコードに対する「復元された」レコードの主キー値。

この「復元」プロセスのプログラミング作業を簡素化するために、特に複数のテーブルを扱っている場合は、JDXAなどの ORM を使用できます。SDK に同梱されているサンプル アプリの 1 つは、データベースを新しいバージョンにアップグレードする際に「古い」データを転送するための同様の手法を示しています。JDXA は、永続化する前にオブジェクトに割り当てることができる一意の ID を簡単かつ効率的に作成するための便利なシーケンス ジェネレーター メカニズムも提供します。

于 2016-02-10T23:39:49.947 に答える