2011-07-28 96 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數據模型將值存儲爲名稱/值對,並且數據庫結構從不需要更改。

1

基於低於約增加一列,每個事件,我強烈建議創建第二個表,其中的每一行將代表一個事件,然後通過存儲用戶的行ID和的標識跟蹤出勤您的評論考勤表中的事件行。將列連續堆放在考勤表上是明確的反模式。

0

作爲每SQLite的FAQ,只有到ALTER TABLE SQL命令的支持有限。因此,唯一可行的方法是可以將現有數據保存到臨時表中,刪除舊錶,創建新表,然後將數據從臨時表中複製回來。

另外,您還可以使用查詢從數據庫中獲取列名。任何查詢都會顯示「SELECT * FROM」,會給你一個cursor對象。您可以使用該方法

String getColumnName(int columnIndex); 

String[] getColumnNames(); 

檢索列的名稱。

相關問題