2017-04-05 8 views
1

データベースのフィールドを更新することに関連する概念的な疑問があります。ユーザコンピュータのテーブルを正しく更新する方法は?

Iは、データを格納するためにSQLiteのを使用QtのC++)アプリケーションを開発しています。 SQLiteファイル(.db)は、ユーザーのコンピュータに格納されています。このファイルは、ユーザーが最初にアプリケーションを開くと自動的に作成されます。

問題は、そのデータベース内の1つのテーブルを更新する必要があることです。 ALTER TABLEコマンドを使用して実行できますが、ユーザーのコンピュータに割り当てられているデータベースのテーブルを正しく更新するにはどうすればよいですか。

テーブルに必要なフィールドがなくてもALTER TABLEコマンドが実行されているかどうかを確認する関数を作成する必要がありますか、それとも他の簡単で正しい方法がありますか?

+0

アプリケーションをどのように配布しますか?アップデーターを使用してアプリケーションを更新する場合は、アップデーターが列の存在をチェックし、必要に応じてDBを更新することができます。 – NathanOliver

+0

ありがとう@NathanOliver。残念ながら、アップデーターはなく、アプリケーション(.exe)は電子メールで送られたリンクによって配布されます。しかし、アプリケーション上に直接カラムの存在を確認することができます。 – KelvinS

答えて

3

さらに一般的な解決策は、DBにバージョン番号エントリを使用し、これに基づいて変更を集中することです。持っていない場合は、このアップデートで作成することができます。限り、私は今、あなたがテーブルに影響を与えることなく、ALTER TABLE複数回実行することができますように、一方

void update_database_to_current_version() { 
    const int version = current_db_version(); // returns 1 if version is not found 

    if (version < 2) { // since version 2 table XYZ has new structure, match here 
     // 'ALTER TABLE' ... 
    } 

    // if (version < N) // DB changes starting in version N 
    // ... 

    update_db_version_to_newest(); 
} 

、:少なくとも私はそれをコード内で明確になると考えると、あなたは将来の変更のための単一のポイントを持っていますもしあなたが好きなら、それはより速いオプションかもしれません。

+3

通常、あなたがやることは、「バージョンラダー」です。これは、次の各バージョンへのすべての単一の更新ステップを含む機能です。そのため、 'switch'ではなく' if'という一連のステップがあり、各ステップでバージョンを次のものに更新します。 –

+0

右私はちょうど私の考えを描いていた...私はこの提案で答えを更新しています! – cbuchart

+0

非常に@cbuchartありがとう、私の問題のための素晴らしい解決策であるようです。私はDBにバージョン番号のエントリがありませんが、** SQLite **でこれを使用する方法を検索します。 – KelvinS

関連する問題