1

PhoneGapとjQueryMobileを使用してiOSとAndroid用のクロスプラットフォームHTML/Javascriptアプリを構築しており、ローカルデータベース(localdatabase / websql)の1つのテーブルにいくつかの新しいフィールドを追加してアプリをアップグレードしています。

課題 データベースが新しいテーブルフィールド、既存のユーザーデータで拡張されたときに、ユーザーデータが削除されたり、アクセスできない古いバージョンのデータベースにロックされたりしないようにしたいと思います。

背景: 私のアプリには、ユーザーのデータ(収入と支出、およびいくつかの設定)のローカルデータベースがあります。これらのデータは永続的である必要があり、私が始めたときの方法はHTML5 localDatabase機能を使用していました。これは永続的であり、iOSとAndroidのブラウザー、およびほとんどのデスクトップブラウザーで利用できるためです。

localdbの処理を少し簡単にするために、persistenceJSと呼ばれるJavascriptプラグイン/ライブラリ/thingyを使用しています。しかし、私の質問は、persistenceJSに固有のものではありません。

私は、設定テーブルのいくつかの新しいフィールドを利用する新しいバージョンのアプリに取り組んでいます。したがって、これらのユーザーが新しいアプリをダウンロードして実行するときは、設定テーブルにこのフィールドが含まれているかどうかをテストする必要があり、含まれていない場合はフィールドを作成する必要があります。

このテストを行うにはどうすればよいですか?私は2つの考えを見る:

  1. openDatabase関数で使用されるデータベースラベル...を使用します。これは、バージョン番号を保存するために一部の開発者によって使用されているようです。このオプションに関する私の問題は、openDatabaseを使用してデータベースを開き(データベースが存在しない場合は新しいデータベースを作成し)、データベースがまだ存在しない場合は特にコールバックを実行する方法しか知らないことです。したがって、ラベルに「v2」などを指定してテーブルを開くと、新しいテーブルが作成されますか?もしそうなら、それは古いテーブルの値を新しいものにコピーしますか?

  2. テーブルフィールドの存在を確認します...openDatabaseを使用して、テーブルフィールドの存在をテストできます。そうでない場合は、追加できます。テストは、ユーザーがアプリを開くたびに実行されますが、これは少し原始的なようです。

ちなみに、webSQL / localDbが大君主によって非推奨になっていることは知っていますが、それでも私のツールであり、今のところはそれに固執したいと思います。

4

2 に答える 2

1

私はここで答えを見つけました:http://blog.maxaller.name/2010/03/html5-web-sql-database-intro-to-versioning-and-migrations/

基本的には、古いバージョンラベルと新しいバージョンラベルを使用してchangeVersionメソッドを適用するだけです。ラベルがない場合、古いラベルは「」です。再ラベル付け中、webSQLは新しいスキーマを古いデータベースに静かに適用します。私の場合、これは新しいフィールドを追加することを意味します。

私がリンクしたチュートリアルは本当に素晴らしいです(そして機能もそうです)。

于 2012-06-06T15:02:16.853 に答える
1

localDb opendatabaseとその移行について詳しく学んだので、別の回答を追加します。

注意として、openDatabaseは次のパラメータを取ります:name-(文字列)データベースのバージョンラベルの名前-(文字列)開きたいバージョン表示ラベル-(文字列)どこにも使用されていないように見えるかなり役に立たない表示名最大サイズ- (int)最大の安全なサイズは5 * 1024 * 1024新しく作成された-=(関数)データベースが以前に存在しなかった場合に起動されます

openDatabaseの出力を変数に割り当てるのが最も賢明です。つまり

myapp.db = openDatabase('mydb'、''、'My database'、5 * 1024 * 1024、newlyCreatedCallback);

まず、openDatabaseの5番目の引数として使用できる「新しく作成された」コールバックを利用するのが賢明なようです。指定したパラメーターを持つデータベースがなかった場合にのみ起動します。データベースがすでに存在しているときにこのコールバックが発生しないようにするには、名前、表示ラベル、および最大サイズが、データベースの最初の作成に使用された値とまったく同じに設定されていることを確認してください。

これを行う理由は、データベースが最初に作成された場合、移行を行う必要がないことを確実に知っているためです。テーブルとフィールドを追加する関数に直接移動できます。ローカルデータベースの読み取りと操作に役立つツールであるpersistenceJSの使用をお勧めします。

openDatabaseを呼び出す前に、jQueryを使用して、ハンドラーが移行を実行するカスタムイベント「dbopen」を作成することをお勧めします。このハンドラーは、2つのイベントによってトリガーできます。1つ目は、先ほど説明した「新しく作成された」コールバックです。2つ目は、openDatabaseの呼び出し後に定義するsetIntervalです。間隔は、openDatabase出力を割り当てたmyapp.db変数の存在を確認する必要があります。

dbopenカスタムイベントを作成する理由は、一連のイベントをトリガーし、その後もコードのフローを継続する「新しく作成された」コールバックを追加した場合、「新しく作成されていない」シナリオでも同様のプロセスが必要になるためです。これを行うopenDatabaseのコールバックはないため、ローカルデータベースの作成を手動で検出し、存在するようになったらすぐに「dbopen」をトリガーする必要があります。

これにはwindow.setIntervalを使用します。jqueryの.one()関数を使用してカスタムの「dbopen」イベントを作成していることを確認してください。この関数は最大で1回起動します。それ以外の場合、データベースが新しく作成された場合は、「新しく作成された」コールバックが発生したときに1回、myapp.db変数が発生したときに1回openイベントを発生させます。

于 2012-07-03T08:39:45.937 に答える