我正在尝试使用firestore构建一个餐厅应用来存储订单和用户。
我尝试了两种方法,第一种方法是将命令的ArrayList作为一个数组写入firestore数据库,但之后不能读取它们......
我使用DocumentSnapshot.toObject(myclassoflist.class)
,但这只适用于文档中没有数组列表,只有values =“..”
然后我创建了一个文档集合(每个文档都是一个项目),其中包含数组作为简单值 要了解这一点,请查看我的数据库
然后,为了阅读它们,我首先获得所有文档ID
db.collection("orders").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
documentsIDs.add(document.getId());
}
Integer allIdsD = task.getResult().size();
if (allIdsD.equals(documentsIDs.size())) {
readDocs();
}
}
}
});
然后,对于每个文档ID,我再创建了3个db.collection(collection).get()
,以便在子集合中获取每个文档的内部,再次使用函数DocumentSnapshot.toObject(myclass.class)
。
这里的问题是从数据库中获取完整的订单需要大约0.8秒,考虑到每天可能有100多个订单,这需要很多次
示例来自:LimatexMM / app / src / main / java / g3org3 / limatexmm / orders.java
修改 我也试着写下如下命令:
orderListBig docData = new orderListBig(list, currentUser, adList, docId);
(列表是ArrayList,currentUser,adList是对象)
db.collection("orderss").document(docId).set(docData)
然后阅读:
db.collection("orderss").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
orderListBig ahah = document.toObject(orderListBig.class);
allOrders.add(ahah); (ArrayList of ordersListBig)
答案 0 :(得分:0)
根据official documentation关于在Cloud Firestore中使用数组,您需要知道:
虽然Cloud Firestore可以存储数组,
it does not support
查询数组成员或更新单个数组元素。
如果您只想获取整个orderList
数组并获取值,请说itemMore
,您需要获取该特定文档的引用,然后迭代Map
喜欢这样:
Map<String, Object> map = documentSnapshot.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getKey().equals("itemMore")) {
Log.d("TAG", entry.getValue().toString());
}
}
但请注意,即使orderList
对象作为数组存储在数据库中,entry.getValue()
也会返回ArrayList
,而不是array
。
我更好地处理您的用例,如果您考虑这种替代数据库结构,其中每个项目都是地图中的关键,并且所有值都为真:
orderList: {
"itemMore": true,
"itemMoreValue": true,
"itemMoreOtherValue": true
}
BAFTA! ;)