我们再也不把枚举值作为数字序数值来存储了;这样会使调试和支持变得过于困难。我们将实际的枚举值转换为字符串进行存储:
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"]);
過去的問題在於盯著企業管理員並試圖解讀其含義。
Name Suit
Kylie Guénin 2
Ian Boyd 1
诗歌
Name Suit
------------ -------
Kylie Guénin 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;
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;
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
维度表:
花色 |
花色ID |
等级 |
颜色 |
未知 |
4 |
0 |
NULL |
红桃 |
1 |
1 |
红色 |
梅花 |
3 |
2 |
黑色 |
方块 |
2 |
3 |
红色 |
黑桃 |
0 |
4 |
黑色 |
这样,当你想要将你的卡牌更改为使用接吻国王新牌的顺序时,你可以为了显示目的而进行更改,而不必放弃所有数据:
花色 |
花色ID |
等级 |
颜色 |
卡片顺序 |
未知 |
4 |
0 |
NULL |
NULL |
黑桃 |
0 |
1 |
黑色 |
1 |
方块 |
2 |
2 |
红色 |
1 |
梅花 |
3 |
3 |
黑色 |
-1 |
红桃 |
1 |
4 |
红色 |
-1 |
现在我们将内部编程细节(枚举名称、枚举值)与用户显示设置分开。
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder