将数组存储到对象数据类型到android和iOS中的firestore(swift)

时间:2018-02-13 04:21:59

标签: android ios google-cloud-firestore

嗨我有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(未知来源)

1 个答案:

答案 0 :(得分:2)

来自official documentation

  

虽然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的数组。如果数组具有您查询的值的多个实例,则文档仅包含在结果中一次。