提问者:小点点

如何在Android FireStore中为一个文档添加多个数据?


数据仅存储在list/0中。 我想要多个数据存储在用户的电子邮件中。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
FirebaseFirestore db = FirebaseFirestore.getInstance(); 

final ArrayList<AddDayInfo> list = new ArrayList<>();
final Map<String,Object> docData = new HashMap<>();
AddDayInfo memberInfo = new AddDayInfo(Type,Day,Name,Time1,Time2,Time3);
list.add(memberInfo);

for(int i=0;i<list.size();i++) {
    if (user != null) {
        docData.put("Day_M", list);
        db.collection("day").document(user.getEmail()).set(docData, SetOptions.merge())
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        startToast("Okay. Add Data..");
                        myStartActivity(Add_Main_Activity.class);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        startToast("Failed...");
                    }
                });
    }
}

我想添加像这张图这样的数据:


共1个答案

匿名用户

要将项添加到Firestore中的数组,您有两个选项:

  • 使用FieldValue.ArrayUnion,确保数组中只有唯一的元素。
  • 读取整个数组,在应用程序代码中更改它,然后写回它。

这两个选项之间的选择取决于您的数据的含义,我预计您实际上需要第二个(更多的)选项。

我们将从FieldValue.ArrayUnion开始,只是为了向您展示如何执行该操作:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

if (user != null) {
    FirebaseFirestore db = FirebaseFirestore.getInstance(); 
    DocumentReference docRef = db.collection("day").document(user.getEmail())

    AddDayInfo memberInfo = new AddDayInfo(Type,Day,Name,Time1,Time2,Time3);
    docRef.update("messages", FieldValue.arrayUnion(memberInfo))...

如果您总是希望将消息添加到数组的末尾,即使该消息的另一个副本已经存在,您也需要:

  1. 读取数组的当前内容
  2. 更改应用程序代码中的数组
  3. 将完整数组写回数据库

由于我们使用当前值来确定新值,因此最好使用一个事务:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

if (user != null) {
    FirebaseFirestore db = FirebaseFirestore.getInstance(); 
    DocumentReference docRef = db.collection("day").document(user.getEmail())

    AddDayInfo memberInfo = new AddDayInfo(Type,Day,Name,Time1,Time2,Time3);

    db.runTransaction(new Transaction.Function<Void>() {
    @Override
    public Void apply(Transaction transaction) throws FirebaseFirestoreException {
        DocumentSnapshot snapshot = transaction.get(docRef);

        List messages = snapshot.get("messages");
        messages.add(memberInfo)

        transaction.update(docRef, "messages", messages);

        // Success
        return null;
    }
})