【问题标题】:How to create new documents all at the same time in Firestore?如何在 Firestore 中同时创建新文档?
【发布时间】:2020-05-14 15:13:45
【问题描述】:

在创建测验应用程序时,当玩家单击某个按钮时,它会在数据库中创建新游戏并打开下一个活动(游戏活动)。我不确定哪种方法是在数据库中设置新文档的最佳方法。

基本上我想知道的是,以下哪种方法是最好的方法,我的假设是否正确。目标是找到确保用户仅在创建所有文档后才能进入下一个活动的最佳方式。

  1. 方法:

我认为这比第二种方法更快,但有可能无法创建某些文档/子集合。 (我创建了更多文档,但我只展示了一些简单性)

...

gameRef.document(gameId).collection("Uid").document("Uid").set(uidPlayers);
gameRef.document(gameId).collection("Turn").document("Turn").set(mTurn);
gameRef.document(gameId).collection("Game Status").document("Game Status").set(gameStatus);
gameRef.document(gameId).collection("Timestamp").document("Timestamp").set(timeStamp);

Intent i = new Intent(FriendDetailActivity.this, GameActivity.class);
startActivity(i);

...
  1. 方法:

这种方法比第一种方法更安全,因为它确保在用户退出此活动之前创建每个文档/子集合,但它确实需要更长的时间。我也简化了这里的代码。它更安全,因为在每次创建后我都会添加一个 onCompleteListener。


...

gameRef.document(gameId).collection("Round").document("Round").set(round)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {

                db.collection("User").document(uidPlayer1).collection("Games").document(uidPlayer2).set(gameUser)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {

                                db.collection("User").document(uidPlayer2).collection("Games").document(uidPlayer1).set(gameUser2)
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {

                                                Intent i = new Intent(FriendDetailActivity.this, GameActivity.class);
                                                startActivity(i);
                                            }
                                        });
                            }
                        });
            }
        });

...

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    如果您想确保同时编写所有文档,请使用batch write 同时创建所有文档。无需检查个人状态。批处理要么同时发生,要么同时失败。

    WriteBatch batch = db.batch();
    
    DocumentReference uidRef = gameRef.document(gameId).collection("Uid").document("Uid");
    batch.set(uidRef, uidPlayers);
    
    // add more documents...
    
    batch.commit().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            // ...
        }
    });
    

    【讨论】:

      【解决方案2】:

      Doug 的回答看起来很棒。

      如果你不想批量写入,你也可以尝试使用CompleteableFuture.allOf,而不是那些嵌套的回调。

      Here's API 文档。

      【讨论】:

        猜你喜欢
        • 2018-07-11
        • 2020-03-03
        • 2019-12-10
        • 1970-01-01
        • 2021-04-02
        • 2020-10-07
        • 1970-01-01
        • 2018-03-19
        相关资源
        最近更新 更多