【发布时间】:2021-04-15 12:39:18
【问题描述】:
谁能告诉我如何将一组自定义对象从一个应用程序存储到 Firebase Firestore (Android) 中,然后将这些对象检索回另一个应用程序(两个应用程序都连接到同一个 Firebase 项目强>)。 我尝试使用 Maps,并且能够存储订单列表,但无法检索 ArrayList。 这是我的做法:
Map<String, ArrayList<OrderItemModel>> map = new HashMap<>();
map.put(currentOrderNumber, orderList);
firebaseFirestore.collection("orders").document(college).set(map, SetOptions.merge())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(getContext(), "Order placed.", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "Couldn't place order. Please try again.", Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
}
});
当我尝试使用 documentSnapshot.getData() 检索它时,它返回 Map
public class OrderItemModel {
private String itemName;
private String itemPrice;
private String itemCount;
public OrderItemModel() {
}
public OrderItemModel(String itemName, String itemPrice, String itemCount) {
this.itemName = itemName;
this.itemPrice = itemPrice;
this.itemCount = itemCount;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public String getItemPrice() {
return itemPrice;
}
public void setItemPrice(String itemPrice) {
this.itemPrice = itemPrice;
}
public String getItemCount() {
return itemCount;
}
public void setItemCount(String itemCount) {
this.itemCount = itemCount;
}
}
我已经尝试解决这个问题一个星期,但仍然没有得到任何结果。我已经尝试了很多东西,但仍然找不到解决方案。如果有什么不清楚的请询问。请帮忙。 谢谢。
编辑:
我正在通过以下方式检索数据:
firebaseFirestore.collection("orders").document(college).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot documentSnapshot = task.getResult();
assert documentSnapshot != null;
if (documentSnapshot.exists()) {
Map<String, Object> listMap = documentSnapshot.getData();
for (Map.Entry<String, Object> entry : listMap.entrySet()) {
Log.d(TAG, "onComplete: Key: " + entry.getKey() + ", Value: " + entry.getValue().toString());
if (entry.getKey().equals(currentOrderNumber)) {
orderList.addAll((Collection<? extends OrderItemModel>) entry.getValue());
}
}
Log.d(TAG, "onComplete: ArrayList: " + orderList.get(0).getItemName()); // This line shows error.
progressBar.setVisibility(View.GONE);
} else {
Toast.makeText(ShowOrder.this, "Order document not found!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(ShowOrder.this, "An error occurred while fetching the data.", Toast.LENGTH_SHORT).show();
}
}
});
据我了解,我成功检索了 Map
Log.d(TAG, "onComplete: ArrayList: " + orderList.get(0).getItemName());
上面一行显示以下错误:
2021-01-10 23:48:40.192 8747-8747/com.campuscanteen.main E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.campuscanteen.main, PID: 8747
java.lang.ClassCastException: java.util.HashMap cannot be cast to com.campuscanteen.main.Models.OrderItemModel
at com.campuscanteen.main.ShowOrder$2.onComplete(ShowOrder.java:89)
at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:230)
at android.app.ActivityThread.main(ActivityThread.java:7815)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
编辑 2:
我按照你的建议做了一堂课:
public class OrderList {
public List<OrderItemModel> modelList;
public OrderList() {
}
@Override
public String toString() {
return "OrderList{" +
"modelList=" + modelList +
'}';
}
}
并尝试了这些行来检索数据:
List<OrderItemModel> myLists = documentSnapshot.toObject(OrderList.class).modelList;
Log.d(TAG, "onComplete: ArrayList: " + myLists.toString()); // myLists here has null value.
这样列表就有了空值。请原谅我缺乏知识,请帮助。
【问题讨论】:
-
您在尝试检索数据时能否提供您的代码?它显示什么错误? - 也提供一个例外
-
如异常所说,您正试图将 HashMap 转换为 OrderItemModel。所以我猜 entry.getValue() 返回类型 HashMap 并且您想在代码行 89 中将其转换为 OrderItemModel。
-
@SlothCoding 是的。我也试过 documentSnapshot.getData().get(currentOrderNumber) 结果是一样的。我不知道该怎么办。你能告诉我一个让arrayList回来的方法吗?我想将arrayList 用于recyclerView。
标签: android firebase google-cloud-firestore development-environment