使用Java在SQLite中存储和检索枚举

时间:2011-11-24 08:27:09

标签: java enums

我需要能够从SQLite数据库中存储和检索枚举,我已经通过结合使用包装类和枚举来解决这个问题,但我觉得它的设计非常糟糕。

每次我想在枚举列表中添加新项目时,我都必须将其添加到三个不同的位置。

枚举必须包含:

  • 表示它的int(或字符串)
  • 一个文本字符串,提供有关枚举本身的更多文本
  • 以某种方式从数据库中恢复其状态的方法

目前实施方式如下:

public class items
{
    public enum types {
        FOO(0),
        BAR(1), 
        BAZ(2);

        private final int _value;
        types(int value){_value = value;}
        public int value(){return _value;}
    }

    public static types Get(int i)
    {
        switch(i)
        {
            case 0:
                return types.FOO;
            case 1:
                return types.BAR;
            case 2:
                return types.BAZ;   
            default: 
                return null;
        }
    }

    public static String Get(Typer type)
    {
        switch(type)
        {
            case FOO:
                return "This is foo!";
            case BAR:
                return "This is bar!";
            case BAZ:
                return "This is baz!";
            default:
                return "No good!";
        }
    }
}

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:21)

枚举值具有FOO.ordinal()函数是值的数字表示。该函数返回零到n-1之间的数字n - 你有多少枚举值。然后,您可以使用types.values()[i]按数字检索值。但是你应该记住,不允许在中间重新排序或添加新的枚举,因为数字会被更改。

此外,您可以使用types.valueOf("FOO")FOO.name()作为枚举值的字符串表示形式。它使用起来更安全,因为它不依赖于声明顺序。

答案 1 :(得分:6)

您可以使用枚举名称进行存储和检索。

types.valueOf("FOO")应提供types.FOOtypes.FOO.name()会为您提供枚举的名称。

如果要通过成员变量检索它,可以执行以下操作:

public static Types byValue(final int value) {
    Types returnvalue = FOO; // default returnvalue
    for (final Types type : Types.values()) {
        if (type.value == value) {
            returnvalue = type;
            break;
        }
    }
    return returnvalue;
}

如果性能至关重要,可以将所有类型放入静态地图中,并将“值”作为关键字。然后你不需要循环并只说valueMap.get(value)。应该在枚举中的静态块中初始化映射。

对于额外的文本值,您可以使用getter为枚举提供类型为String的第二个成员变量。因此,关联的int和String值仅在初始化中。

例如,

FOO(0,"Hello I'm Foo"),
BAA(1,"Hello I'm Baa"),
...