在事务完成时更新其他节点

时间:2018-01-30 15:50:25

标签: android firebase firebase-realtime-database

我在Android中学习Firebase,我正在尝试使用各自的插槽制作一个房间系统。在这种情况下,一些用户可能希望在我决定使用Firebase交易的同时访问同一个插槽。

因此,当用户尝试登录我所做的插槽时:

mySlotRef1.runTransaction(new Transaction.Handler() {
                    @Override
                    public Transaction.Result doTransaction(MutableData mutableData) {
                        Slot p = mutableData.getValue(Slot.class);
                        if (p == null) {
                            return Transaction.success(mutableData);
                        }
                        if (p.getState().equals("closed")) {
                            return Transaction.abort();
                        }

                        // Set value and report transaction success
                        Slot sl1 = new Slot("slot1", idRoom, auth.getCurrentUser().getDisplayName(), auth.getCurrentUser().getUid(), "closed", Profile.getCurrentProfile().getProfilePictureUri(200, 200).toString());
                        mutableData.setValue(sl1);
                        return Transaction.success(mutableData);
                    }

                    @Override
                    public void onComplete(DatabaseError databaseError, boolean b,
                                           DataSnapshot dataSnapshot) {
                        // Transaction completed
                        Log.d(TAG, "postTransaction:onComplete:" + databaseError);

                    }
                });

我觉得这很有效,我。即当插槽关闭时,它只进入一个用户并拒绝“插槽”参考中的其他用户。但问题是我还需要在“用户”目录中更新另外两个值,而且“只有当用户占用插槽时才能找到办法”,即交易完成时。

更新: 这是我检查插槽是否打开的部分。

mySlotRef1.addListenerForSingleValueEvent(new ValueEventListener() {

                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    Slot data = dataSnapshot.getValue(Slot.class);
                                    state = data.getState();
                                    if (state.equals("open")) {
                                        saveSlot(slot);
                                    } else {
                                        Toast.makeText(getApplicationContext(), "Slot not available", Toast.LENGTH_SHORT).show();
                                    }
                                }

                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }

                            });

1 个答案:

答案 0 :(得分:1)

当谈到concurent写道时,这不是事情的运作方式。您的所有广告位都不会被关闭。当您使用事务时,这意味着将由不同用户在同一时间进行的每个写入将在不同的执行线程中进行。因此,使用交易,如果两个或许多其他用户同时进行写操作并不重要,那么您将获得正确的结果。

如果要更新另一个类中的otrher字段,只需将您的逻辑放在onComplete()方法中。一旦交易完成,就会触发此方法。