私たちは、決してもう数値序数値として列挙を格納しません。デバッグとサポートが非常に難しくなります。文字列に変換された実際の列挙値を保存します。
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
そして次に読み直してください:
Suit theSuit = Suit.valueOf(reader["Suit"]);
問題は過去にEnterprise Managerを見つめて解読しようとしていました:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
詩
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
後者の方がはるかに簡単です。前者は、ソースコードにアクセスして、列挙型メンバーに割り当てられた数値を見つける必要がありました。
はい、それはより多くのスペースを必要としますが、列挙メンバー名は短く、ハードドライブは安価であり、問題が発生しているときに役立つとはるかに価値があります。
さらに、数値を使用する場合は、それらに関連付けられます。古い数値を強制することなく、メンバーをうまく挿入または再配置することはできません。たとえば、Suit列挙を次のように変更します。
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
になる必要があります:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
データベースに保存されている従来の数値を維持するため。
それらをデータベースでソートする方法
質問が出てきました:値を注文したいとしましょう。一部の人々は列挙型の序数値でそれらをソートしたいかもしれません。もちろん、列挙の数値によるカードの順序付けは無意味です。
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
それは私たちが望む順序ではありません-それらを列挙順にしたいです:
SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
WHEN 4 THEN 0 --Unknown first
WHEN 1 THEN 1 --Heart
WHEN 3 THEN 2 --Club
WHEN 2 THEN 3 --Diamond
WHEN 0 THEN 4 --Spade
ELSE 999 END
文字列を保存する場合、整数値を保存する場合と同じ作業が必要です。
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
しかし、それは私たちが望む順序ではありません-それらを列挙順にしたいです:
SELECT Suit FROM Cards
ORDER BY CASE Suit OF
WHEN 'Unknown' THEN 0
WHEN 'Heart' THEN 1
WHEN 'Club' THEN 2
WHEN 'Diamond' THEN 3
WHEN 'Space' THEN 4
ELSE 999 END
私の意見では、この種のランキングはユーザーインターフェイスに属します。列挙値に基づいてアイテムを並べ替えている場合:何かが間違っています。
しかし、本当にそうしたいのであれば、Suits
ディメンションテーブルを作成します。
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
このように、Kissing Kings New Deck Orderを使用するようにカードを変更したい場合、すべてのデータを破棄せずに表示目的で変更できます。
| Suit | SuitID | Rank | Color | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown | 4 | 0 | NULL | NULL |
| Spade | 0 | 1 | Black | 1 |
| Diamond | 2 | 2 | Red | 1 |
| Club | 3 | 3 | Black | -1 |
| Heart | 1 | 4 | Red | -1 |
ここで、内部プログラミングの詳細(列挙名、列挙値)をユーザー向けの表示設定で分離します。
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder