2

アプリで何らかのバックアップと復元機能を作成しようとしています。その前に、私は達成することが可能かどうかを理解するためにしばらく読んでいましたが、私はこの質問を見つけました: Sqlite DB Android Backup / Restore

私がそれを行うために見ることができる他の唯一の方法は、DBの実際の内容を読み取り、それを復元できるSQLを含むファイルを生成することです。これは明らかにより複雑であり、この複雑さを正当化します。

この答えは、それを達成するための最良の方法だと思います。.dbファイルを探索するのではなく、クエリをエクスポートします。

ほら; mysqlからSQLデータをエクスポートすると、構造を作成するすべてのクエリと、構造をデータで埋めるクエリを含むファイルが取得されます。

それが私が模倣しようとしていることです。.dbファイルからSQLクエリを含むファイルを生成します。

皆さんはそれが可能だと思いますか、つまり、それを達成するための組み込みの方法はありますか?

そうでなければ、処理が難しすぎる場合、このユーザー( https://stackoverflow.com/a/10842043/1943607)が話していることをどのように回避できますか?

そこで、「PRAGMAjournal_mode = DELETE」でWALを無効にすると、ブラウザでデータベースを表示し、テストデバイスで正常に復元できました。

その前の部分、私はそれを理解することはできません。これはsqliteに設定した構成ですか?

ありがとう

4

3 に答える 3

1

sqliteデータベースは単なるファイルなので、ファイルをコピーできますが、Androidの権限に問題があり、データベースにアクセスできない可能性があると思います。

IMOのより良い解決策は、データを外部のWebサイトに同期することです。カスタム同期アダプターとアカウントマネージャーを、同期されたデータを送受信するためのRESTfull apiを備えたWebサイトまたはWebサービスと組み合わせて使用​​するのが、最も信頼性の高いアプローチです。

http://developer.android.com/training/id-auth/identify.htmlは、アカウントマネージャーを設定するための優れた入門書です。

また、カスタム同期アダプターの場合、これは優れた出発点です。 http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/ およびhttp://www.c99.org/2010/01/23/writing-an -android-sync-provider-part-2 /

そして最後に、すべてがどのように組み合わされるかについての説明 https://sites.google.com/site/andsamples/concept-of-syncadapter-androidcontentabstractthreadedsyncadapter 上記のアプローチにより、ユーザーは電話の切り替えとデータの保持を同時に行うことができます。データは常に最新です(適切なタイミングで同期できる場合)。

Webサービスを設定する必要があるため、大変な作業のように思われますが、データを安全に保管し、いつでも復元およびバックアップできるようにするための最良の方法です。

Webサービスの場合、Googleドキュメントなどのクラウドサービスや独自のWebサイトの作成など、利用できるオプションがたくさんあります。Ruby on Railsは、完全なRESTfull apiをすぐに使用できるため、独自のサイトを開発するための優れたソリューションです。数行のコードと、 Herokuを使用すると、無料のホスティングを利用できます。

Android開発ではいつものように、最も単純な要件を実際に実装するのが最も困難になりますが、データの安全性が最優先される場合は、適切に実行する価値があります。

于 2013-03-19T10:11:38.353 に答える
1

私は実際にsqliteでこれを試していませんが、mysqlを使用すると、データベースの「ダンプ」を作成するなどのことができます。これらのダンプには、あなたが説明した内容が正確に含まれていました。つまり、一緒に実行すると、コンテンツを含むデータベースを再作成する一連のクエリです。

http://www.sqlite.org/sqlite.htmlにある「sqlite3」ドキュメント(特に「データベース全体をASCIIテキストファイルに変換する」セクション)から判断すると、sqliteでも同じことができます。Javaアプリケーションから(Runtime.getRuntime()。exec()メソッドを使用して)シェルコマンドを実行でき、データベースの「所有者」(LinuxユーザーID)であるため、この「sqlite3」を実行できるはずです。ルート化されていないデバイスでも「dump」コマンド。sqlite3ツールがインストールされていないAndroidデバイスを見たことがないので、コマンドは常に使用可能である必要があります。

さらに、ダンプファイルは単なるテキストファイルであるため、互換性のために必要なプラグマ(引用したものなど)を追加できるはずです。

私はこれをテストしていませんが、この興味深いトピックについてあなたと一緒に考えたかっただけです。

于 2013-03-19T09:30:58.840 に答える
0

db ファイルの内容に適用される可能性のある変更が公開されており、特定の動作を保証できないという理由だけで、この質問は公開されすぎて答えられません。

プラス面では、sqlite プロジェクトはオープン ソースであり、DB ファイルの形式が指定されています

そこを調べた後、データのみを探してDBファイルを解析し、それを別の機能するdbファイルに書き込む/ダンプすることは非常に可能/それほど複雑ではないようです。

これが、当面の問題に対する最も迅速でクリーンな解決策であると私は信じています。

まとめとして:

  • バックアップするたびにDBファイルをコピーします。
  • 復元する場合は、Android API を使用して新しい DB を作成します。
  • バックアップされたファイルからデータを解析し、新しく作成された DB に書き込みます。

PS: 使い方について

PRAGMA journal_mode = DELETE

db.exec("PRAGMA journal_mode = DELETE");DB作成時に使うだけ

于 2013-03-19T12:54:38.830 に答える