1

私は2つのデータベースを持っています。1はMySQLで、ゲームAPIを使用してゲームに関する最新情報を収集します。私が持っているもう1つのデータベースは、アプリで作成したsqlite DBです(どちらも同じテーブルと列を持っています)。これをどのように機能させたいかというと、アプリが起動し、MySQLのバージョンがチェックされます(プレイするゲームが更新されるたびに更新されます)MySQLのバージョンがsqliteのバージョンと一致するかどうかを確認し、必要に応じて更新します。

私が抱えている混乱は、MySQL DBのマイナーな変更が発生したときに、ユーザーがアプリ全体を更新する必要がないことです(アイテムの統計が変更される、アイテムが追加される、キャラクターが追加される、または能力の統計こことVogellaチュートリアルで見ているのは、実際に手動で変更する必要があるように見えるためです。

private static final int DATABASE_VERSION = 1;  //<<<<<Manually change this
...

public MySQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

これは私が達成しようとしている目的を打ち破ります。

1)コードで実際に手動で変更せずにDATABASE_VERSIONを更新する方法はありますか?

2)onUpgrade(db、oldVersion、newVersion)を直接呼び出して、必要なパラメーターを入力できますか、それともこれは非常に悪い考えであり、処理する必要がありますgetWritableDatabase()か?

4

2 に答える 2

3

データベースのバージョンが変更されるのは、テーブル構造が変更された場合、つまりテーブルが追加または削除された場合、または一部の列が変更、追加または削除された場合のみです。この場合、アプリの新しいバージョンがインストールされると、Androidは新しいデータベースバージョンを検出してを呼び出しますonUpgrade

テーブル内のデータを更新するだけの場合、テーブル構造に変更はないため、データベースのバージョン番号を増やす必要はありません。

この場合、列の1つにシリアル番号またはタイムスタンプを追加して、現在のデータバージョンを識別し、対応するSQLiteデータベーステーブルに保存されているバージョンまたはタイムスタンプと比較できます。

これらが異なる場合は、MySQLデータベースからデータを更新できます。

更新

アプリを更新してもテーブル構造が変更されていない場合、データベースのバージョンは同じままで、データベースとそのデータは変更されません。

アプリを更新してテーブル構造が変更されると、データベースのバージョン番号が増加します。Androidは、現在のバージョンと新しいバージョンを比較して、を呼び出しますonUpgrade。これで、データベースのアップグレード、データベースレイアウトの変更、新しいテーブルまたは列の入力など、必要な手順を実行できます。すべてを破棄して、新しいデータベースを最初から構築することもできます。

これはすべて、アプリが実行され、メインサーバーデータベースから現在のデータを取得するときの日々の更新とは無関係です。

于 2013-03-25T19:48:58.067 に答える
1

中央のMySQLデータベースからスキーマを読み取り、Androidデバイスにローカルコピーを保持しているようです。中央データベースのスキーマを変更する場合、はい、ローカルコピーを手動で変更するのはばかげています。

1)コードで実際に手動で変更せずにDATABASE_VERSIONを更新する方法はありますか?

DATABASE_VERSION他の変数と同じように、外部ソースからの値を制御したい場合は、それが可能です。正直なところ、この変数は必要ありません。SQLiteOpenHelperのコンストラクターでのみ使用されます。

SQLiteOpenHelper(Context context, String name, 
        SQLiteDatabase.CursorFactory factory, int version)

SQLiteDatabaseは、独自のプライベートバージョン番号を維持します。

2)onUpgrade(db、oldVersion、newVersion)...を直接呼び出すことはできますか?

内部バージョン番号を変更したり、SQLiteOpenHelperで使用される他の内部チェックをスキップしたりすることはないため、これを行うことはお勧めしません。
はい、これらのチェックの多くは手動で実行できますが、作成するすべての回避策で、SQLiteOpenHelperの有用性が低下しています。Context#openOrCreateDatabase()独自のバージョン管理コードを作成するので、ある時点で直接呼び出す方がよいでしょう。

于 2013-03-25T19:58:52.867 に答える