【发布时间】:2018-08-24 09:57:29
【问题描述】:
我正在尝试将一些数据从我的 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);
}
}
});
}
我不确定是否有人能得到我想要的结果,但如果它确实以某种方式起作用,我真的很喜欢。
编辑: 明确一点:如果枚举仅由枚举名称组成,或者名称和值相同,我可以将字符串转换为枚举。
提前致谢。
【问题讨论】:
-
如果你想使用一个类作为 Firebase 实体。类应该有公共的空构造函数(和值设置器/获取器)。枚举不是实体类。您可以创建一个包含枚举值的类。 stackoverflow.com/a/37376885/5272951
标签: java android firebase enums google-cloud-firestore