gpt4 book ai didi

java - Firebase Cloud Firestore – 将字符串转换为 Java 枚举

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:14 24 4
gpt4 key购买 nike

我正在尝试将一些数据从我的 Cloud Firestore 获取到我的 Android 应用程序中,但我遇到了枚举问题。我已经在 Cloud Firestore 中保存了一个字符串作为枚举的值,但是当我将收到的 DocumentSnaphot 转换为一个对象时,应用程序崩溃了,因为它试图根据枚举名称(这不是' t 与值相同)。

我得到的错误是(我正在发送值“NLD”):

java.lang.RuntimeException: Could not deserialize object. Could not find enum value of nl.gemoro.lgs.enums.CountryCode for value "NLD" (found in field 'address.countryCode') 

枚举看起来像这样:

public enum CountryCode {
NETHERLANDS("NLD"),
UNKNOWN("???");

private final String value;

CountryCode(String s) {
value = s;
}

public boolean equalsValue(String otherValue) {
return value.equals(otherValue);
}

public String toString() {
return this.value;
}
}

我正在使用此方法从 Firestore 获取数据并将 DocumentSnapshot 转换为给定的类:

public static void getAllDocumentsConverted(String collection, final Class convertClass, final OperationCompletedListener listener) {
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection(collection)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
Log.d(TAG, "Found " + task.getResult().size() + " documents");
List<Object> list = new ArrayList<>();
List<String> ids = new ArrayList<>();
for (DocumentSnapshot document : task.getResult()) {
list.add(document.toObject(convertClass));
ids.add(document.getId());
}
listener.onOperationComplete(Result.SUCCESS, list, ids);
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
listener.onOperationComplete(Result.FAILED);
}
}
});
}

我不确定是否有人能得到我想要的结果,但如果它能以某种方式起作用,我真的很喜欢。

编辑:明确一点:如果枚举仅由枚举名称组成,或者名称和值相同,我可以将 String 转换为枚举。

提前致谢。

最佳答案

枚举大小写需要与可能的字符串值完全匹配,包括大小写。

例如,如果您所在国家/地区的值为 "NLD""US" ,您的枚举结构应如下所示:

public enum CountryCode {
NLD,
US
}

这让 Firebase 自动将字符串转换为您要转换到的模型的枚举。

注意:Firebase 使用 <YourEnumType>.valueOf("value-from-doc")尝试序列化为枚举。你不能覆盖 valueOf对于 Java 中的枚举,所以这是我们目前能做的最好的事情,将字符串序列化为枚举。


话虽这么说,如果您这样做,如果您收到的值与您的任何枚举值都不匹配,那么您就会遇到异常。相反,您可以使用 Android's @StringDef annotation .

这允许您设置允许的值以供您检查并在代码中设置,同时允许将实际值设置为任何字符串。如果您从数据库中获得错误的值,这将很有用。它与枚举非常相似。您还可以使用它来为自己提供与您从 Firebase 收到的可能字符串值不同的常量名称。

你会改变你的 CountryCode枚举如下:

public class ClassYouAreConvertingTo {
private static final String NETHERLANDS = "NLD";
private static final String UNKNOWN = "???";

@StringDef({NETHERLANDS, UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
private @interface CountryCode {}

private String countryCode;

@CountryCode
public String getCountryCode() {
return this.countryCode;
}
}

现在国家/地区代码可以设置为任何值,但 Android Studio 会尝试确保您在检查字符串相等性时仅使用 NETHERLANDS 和 UNKNOWN 常量。使用不同的值时,您会看到一条红色下划线(尽管该应用仍会编译并运行)。

IMO 这是比枚举路由更安全、更好的解决方案。接受所有值,但只关心代码中的预期值。

关于java - Firebase Cloud Firestore – 将字符串转换为 Java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com