2011-07-28 8 views
3

私が現在取り組んでいるAndroidアプリケーションは、SQLiteデータベースに列を動的に追加します。私が持っている問題は、データベースからこれらの列を削除する方法を見つけることができないということです。SQLiteデータベースの列を削除できますか?

列A、B、C、D、Eをデータベースに追加すると、後で列Cを削除できますか?

私は周りを見回していましたが、バックアップテーブルを作成し、そのバックアップテーブルにすべての列(削除するものを除く)を移動する必要があるソリューションが見つけられました。

私はこれをどうやって行うのか分かりません。すべての列を動的に追加して、Javaコード内で名前が変数として定義されないようにします。 AndroidのSQLiteDatabaseを使用して列名を取得する方法はありません。

+5

テーブルにカラムを動的に追加するアプリでは、デザインの匂いに気付き、特にスケーラブルではありません。 – Joe

+0

ユーザ生成テーブルはどうですか? – binnyb

+1

@Joe:以下の特定のコメントに基づいて私はあなたに同意します。 Funkytownは、出欠追跡アプリケーションでEventオブジェクトを表す列を追加しようとしています。イベントは独自のテーブルにある必要があります。 (詳細は私の答えを参照してください) –

答えて

1

SQLiteは、SQL構文で列を削除する方法をサポートしていないため、ラッパーAPIには表示されません。 SQLiteは、従来のデータベースがサポートしているすべての機能をサポートすることはしばしばありません。

あなたが特定した解決策は意味があり、それを行う方法です。醜いが、それを行う有効な方法。

また、新しいバージョンのアプリでは、列を「非推奨」し、慣例で使用することはできません。そうすれば、C列に依存している古いバージョンのアプリケーションは壊れません。テーブルスキーマを知る方法に関して

+0

ありがとうございます、あなたは私の疑惑を確認できませんでした。私は自分がやっていることをする別の方法を見つけなければならないでしょう。アプリは(基本的に)出席者追跡のスプレッドシートです。新しい「イベント」を追加して、出席した人または出ていない人を示すことができます。列は「イベント」です。あなたが誤ってイベントを作成した場合は、そのイベントを削除したいと思っていました。 – Funkytown

1

ああ...ちょうどこのコメントに気づい:

をアプリは(基本的に)出席者追跡のスプレッドシートです。新しい「イベント」を に追加して、出席した人または出席しなかった人を示すことができます。 列は「イベント」です。

このコメントに基づいて、イベントの別のテーブルを作成し、他のテーブルのテーブルにリンクするだけで済みます。そのような新しいドメインオブジェクトをサポートするために列を追加する必要はありません。各論理ドメインオブジェクトは、それぞれ独自のテーブルで表される必要があります。例えば。ユーザー、場所、イベント...

これは最初に書きました。関心がある場合はそれを維持します:

動的に列を追加および削除する代わりに、動的である必要があるデータベースの部分にはEAV data modelを使用することを検討する必要があります。

EAVデータモデルは、名前と値のペアとして値を格納し、db構造を変更する必要はありません。

1

各イベントの列を追加することに関する下記のコメントに基づいて、各行がイベントを表す2番目の表を作成してから、ユーザーの行IDと出席テーブルのイベント行出席テーブルに列を連続的に積み重ねることは、明確な反パターンです。

0

SQLite FAQによると、ALTER TABLE SQLコマンドのサポートは限られています。したがって、既存のデータを一時テーブルに保存し、古いテーブルを削除し、新しいテーブルを作成し、一時テーブルからデータをコピーすることができる唯一の方法です。

また、クエリを使用してデータベースから列名を取得することもできます。 "SELECT * FROM"と答えると、cursorオブジェクトが返されます。あなたは列の名前を取得するための方法

String getColumnName(int columnIndex); 

または

String[] getColumnNames(); 

を使用することができます。

関連する問題