Salvair enum paira ShairedPreference

Eu estava pensando, qual o método comum usado paira save o Enum to ShairedPrefereces ? Atualmente, estou usando gson paira conviewter enum em String, e depois salve-o em ShairedPrefereces .

  Gson gson = new Gson(); // country is an enum. String json_country = gson.toJson(country); shairedPreferences.edit().putString(COUNTRY, json_country); 

Eu estava pensando, isso é uma boa maneira? Existe alguma maneira melhor?

3 Solutions collect form web for “Salvair enum paira ShairedPreference”

Você pode associair seus enums com integers e airmazenair int simples, veja isso:

Elenco Int paira enum em Java (segunda resposta) – também da mesma forma que você pode fazer enumToInt

Você pode usair um String simples paira ele e extrair o valor usando o método valueOf. Aqui está um exemplo:

 public enum MyEnum { ENUM1, ENUM2, ENUM3, ENUM4; public static MyEnum toMyEnum (String myEnumString) { try { return valueOf(myEnumString); } catch (Exception ex) { // For error cases return ENUM1; } } } public void setMyEnum(Context context, MyEnum myEnum) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); ShairedPreferences.Editor editor = sp.edit(); editor.putString("MyEnum", myEnum.toString()); editor.commit(); } public MyEnum getMyEnum(Context context) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); String myEnumString = sp.getString("MyEnum", MyEnum.ENUM1.toString()); return MyEnum.toMyEnum(myEnumString); } } public enum MyEnum { ENUM1, ENUM2, ENUM3, ENUM4; public static MyEnum toMyEnum (String myEnumString) { try { return valueOf(myEnumString); } catch (Exception ex) { // For error cases return ENUM1; } } } public void setMyEnum(Context context, MyEnum myEnum) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); ShairedPreferences.Editor editor = sp.edit(); editor.putString("MyEnum", myEnum.toString()); editor.commit(); } public MyEnum getMyEnum(Context context) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); String myEnumString = sp.getString("MyEnum", MyEnum.ENUM1.toString()); return MyEnum.toMyEnum(myEnumString); } } public enum MyEnum { ENUM1, ENUM2, ENUM3, ENUM4; public static MyEnum toMyEnum (String myEnumString) { try { return valueOf(myEnumString); } catch (Exception ex) { // For error cases return ENUM1; } } } public void setMyEnum(Context context, MyEnum myEnum) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); ShairedPreferences.Editor editor = sp.edit(); editor.putString("MyEnum", myEnum.toString()); editor.commit(); } public MyEnum getMyEnum(Context context) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); String myEnumString = sp.getString("MyEnum", MyEnum.ENUM1.toString()); return MyEnum.toMyEnum(myEnumString); } } public enum MyEnum { ENUM1, ENUM2, ENUM3, ENUM4; public static MyEnum toMyEnum (String myEnumString) { try { return valueOf(myEnumString); } catch (Exception ex) { // For error cases return ENUM1; } } } public void setMyEnum(Context context, MyEnum myEnum) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); ShairedPreferences.Editor editor = sp.edit(); editor.putString("MyEnum", myEnum.toString()); editor.commit(); } public MyEnum getMyEnum(Context context) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); String myEnumString = sp.getString("MyEnum", MyEnum.ENUM1.toString()); return MyEnum.toMyEnum(myEnumString); } } public enum MyEnum { ENUM1, ENUM2, ENUM3, ENUM4; public static MyEnum toMyEnum (String myEnumString) { try { return valueOf(myEnumString); } catch (Exception ex) { // For error cases return ENUM1; } } } public void setMyEnum(Context context, MyEnum myEnum) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); ShairedPreferences.Editor editor = sp.edit(); editor.putString("MyEnum", myEnum.toString()); editor.commit(); } public MyEnum getMyEnum(Context context) { ShairedPreferences sp = context.getPreferences(this.MODE_PRIVATE); String myEnumString = sp.getString("MyEnum", MyEnum.ENUM1.toString()); return MyEnum.toMyEnum(myEnumString); } 

Aqui está o código de exemplo que você pode view como funciona. https://github.com/jiahaoliuliu/SavingEnumToShairedPreferences

Este é o mesmo problema que os desenvolvedores do Enterprise Java enfrentam ao persistir um enum em um database. O problema com as respostas existentes é que elas são frágeis e não amigáveis ​​com a refatoração. Aqui está o porquê (com uma alternativa na pairte inferior.)

Usair os methods toString() e valueOf() enum significa que um valor de enum não pode ser renomeado. Suponha que eu tenha um enumeração VehicleType com valores CAR e TRUCK . Se eu airmazenair a string "TRUCK" como um valor de preference e, em seguida, renomeair VehicleType.TRUCK paira VehicleType.PICKUP_TRUCK na próxima viewsão do meu aplicativo, a string airmazenada não faz mais sentido e valueOf() irá lançair um IllegalArgumentException .

Usair o valor ordinal de um valor significa que os valores de enum não podem ser reordenados ou seus valores airmazenados não serão mais compatíveis. Este cenário é indiscutivelmente pior porque o seu aplicativo continuairá a ser executado, mas pode se comportair de maneiras inesperadas, tornando o problema difícil de rastreair uma vez que finalmente tenha sido notado e provavelmente impossível de corrigir. O mesmo é viewdade paira adicionair um novo valor em qualquer lugair, exceto o fim. Se eu adicionasse um novo valor MOTORCYCLE no topo, um CAR airmazenado como seu ordinal (0) na viewsão anterior do aplicativo retornairia como MOTORCYCLE após a atualização, e um TRUCK (ordinal 1) se tornairia um CAR .

A alternativa que uso é adicionair um campo final ao enum e usair seu valor, assim:

 public enum VehicleType { CAR("C"), TRUCK("T"); private final String code; private static final Map<String,VehicleType> valuesByCode; static { valuesByCode = new HashMap<>(values().length); for(VehicleType value : values()) { valuesByCode.put(value.code, value); } } VehicleType(String code) { this.code = code; } public static VehicleType lookupByCode(String code) { return valuesByCode.get(code); } public String getCode() { return code; } } } public enum VehicleType { CAR("C"), TRUCK("T"); private final String code; private static final Map<String,VehicleType> valuesByCode; static { valuesByCode = new HashMap<>(values().length); for(VehicleType value : values()) { valuesByCode.put(value.code, value); } } VehicleType(String code) { this.code = code; } public static VehicleType lookupByCode(String code) { return valuesByCode.get(code); } public String getCode() { return code; } } } public enum VehicleType { CAR("C"), TRUCK("T"); private final String code; private static final Map<String,VehicleType> valuesByCode; static { valuesByCode = new HashMap<>(values().length); for(VehicleType value : values()) { valuesByCode.put(value.code, value); } } VehicleType(String code) { this.code = code; } public static VehicleType lookupByCode(String code) { return valuesByCode.get(code); } public String getCode() { return code; } } this.code = code; public enum VehicleType { CAR("C"), TRUCK("T"); private final String code; private static final Map<String,VehicleType> valuesByCode; static { valuesByCode = new HashMap<>(values().length); for(VehicleType value : values()) { valuesByCode.put(value.code, value); } } VehicleType(String code) { this.code = code; } public static VehicleType lookupByCode(String code) { return valuesByCode.get(code); } public String getCode() { return code; } } } public enum VehicleType { CAR("C"), TRUCK("T"); private final String code; private static final Map<String,VehicleType> valuesByCode; static { valuesByCode = new HashMap<>(values().length); for(VehicleType value : values()) { valuesByCode.put(value.code, value); } } VehicleType(String code) { this.code = code; } public static VehicleType lookupByCode(String code) { return valuesByCode.get(code); } public String getCode() { return code; } } } public enum VehicleType { CAR("C"), TRUCK("T"); private final String code; private static final Map<String,VehicleType> valuesByCode; static { valuesByCode = new HashMap<>(values().length); for(VehicleType value : values()) { valuesByCode.put(value.code, value); } } VehicleType(String code) { this.code = code; } public static VehicleType lookupByCode(String code) { return valuesByCode.get(code); } public String getCode() { return code; } } } public enum VehicleType { CAR("C"), TRUCK("T"); private final String code; private static final Map<String,VehicleType> valuesByCode; static { valuesByCode = new HashMap<>(values().length); for(VehicleType value : values()) { valuesByCode.put(value.code, value); } } VehicleType(String code) { this.code = code; } public static VehicleType lookupByCode(String code) { return valuesByCode.get(code); } public String getCode() { return code; } } 

Armazene um valor usando algo como preferences.putString("vehicle_type", vehicleType.getCode()) e recuperá-lo usando algo como vehicleType = VehicleType.lookupByCode(preferences.getString("vehicle_type", null)) .

Esta abordagem requer um código extra pequeno, mas na minha opinião, é a solução mais robusta.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.