嗨我有2个阵列 PHONENUMBER [1,2,3] 量[10,20,30] 我需要将数据存储在单个文档中 field1:1 field2:10
我尝试的代码是
我把对象拿走了 **
public class Pojo {
String invitee;
Map<Integer,Integer>phoneAmount;
public Pojo(String invitee, Map<Integer, Integer> phoneAmount)
{
this.invitee = invitee;
this.phoneAmount=phoneAmount;
}
}**
在另一个班级
Map<int[], int[]> phoneAmount = new HashMap<>();
phoneAmount.put(phonenumber,amount);
db.collection("Split").document("invitees").set(phoneAmount).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully written!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error writing document", e);
}
});
它显示错误 java.lang.RuntimeException:无法序列化对象。不支持使用非字符串键的地图 在com.google.android.gms.internal.zzejw.zza(未知来源) 在com.google.android.gms.internal.zzejw.zza(未知来源) 在com.google.android.gms.internal.zzejw.zzbp(未知来源)
答案 0 :(得分:2)
虽然Cloud Firestore可以存储数组,但它不支持查询数组成员或更新单个数组元素。
这种方法是我个人不推荐使用的方法。 Firebase建议不要使用数组的众多原因之一是它使安全规则无法编写。
但是,您仍然可以通过利用Cloud Firestore的其他功能来建模此类数据。
让我们举个例子。假设您有一个如下所示的数据库:
{
title: "My Book",
categories: [
"science",
"computer science",
"technology"
]
}
如果您想查询属于&#34;科学&#34;的所有books
,您需要知道。类别,使用此数据结构,无法执行此查询。
要解决此问题,您可以考虑另一种数据结构,其中每个类别都是地图中的关键字,所有值都是true
。
{
title: "My Book",
categories: {
"science": true,
"computer science": true,
"technology": true
}
}
要查询数据库,您可以使用此查询:
db.collection("books")
.whereEqualTo("categories.science", true)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {/* ... */});
对于您的特定情况,您可以使用如下所示的数据库结构:
{
title: "phonenumber",
categories: {
"12345": true,
"67890": true,
"43215": true
}
}
要查询,请使用以下代码:
db.collection("phonenumbers")
.whereEqualTo("categories.12345", true)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {/* ... */});
编辑2018年8月13日:
根据有关array membership的更新文档,现在可以使用whereArrayContains()
方法根据数组值过滤数据。一个简单的例子是:
CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");
此查询返回每个城市文档,其中regions字段是包含west_coast的数组。如果数组具有您查询的值的多个实例,则文档仅包含在结果中一次。