addListenerForSingleValueEvent会重复输出

huangapple 未分类评论46阅读模式
英文:

addListenerForSingleValueEvent keeps duplicating output

问题

我使用addListenerForSingleValueEvent将值添加到当前用户的子项"code"中,但数据重复了。
这是编码之前的数据库

以下是addListenerForSingleValueEvent的代码:

b4.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mAuth = FirebaseAuth.getInstance();
        mUser = mAuth.getCurrentUser();
        final String UserId = mUser.getUid();

        mReference = FirebaseDatabase.getInstance().getReference("Users");
        final DatabaseReference currentUserId = mReference.child(UserId);
        currentUserId.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                user.setCode(riasec1);
                currentUserId.child("code").setValue(user.getCode());
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
});

这是执行编码后的数据库,为什么整个用户被复制,而不仅插入"value"为"code"的值?

英文:

I use addListenerForSingleValueEvent to add value into the child "code" of the current user, but instead the data duplicated.
Here is the database before the coding

This is the coding for the addListenerForSingleValueEvent
<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-html -->

b4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mAuth = FirebaseAuth.getInstance();
                mUser = mAuth.getCurrentUser();
                final String UserId = mUser.getUid();

                mReference = FirebaseDatabase.getInstance().getReference(&quot;Users&quot;);
                final DatabaseReference currentUserId = mReference.child(UserId);
                currentUserId.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        User user = dataSnapshot.getValue(User.class);
                        user.setCode(riasec1);
                        currentUserId.child(UserId).setValue(user);
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });




            }
        });

<!-- end snippet -->

Here is the database after the coding is executedWhy is the whole user being duplicated instead of only value "code" inserted?

答案1

得分: 0

当您调用以下代码时:

currentUserId.child(UserId).setValue(user);

您实际上在表达“将整个用户添加到名为'UserId'的节点中”。
通常情况下,您会获取整个用户对象,然后更新一个字段,再进行更新。

因此,当您希望更新子项而不重写整个对象时,您应该传递节点名称,例如:

currentUserId.child(UserId).child("code").setValue(riasec1);

在这个调用中,您在表达:

  • 找到具有正确ID(UserId)的节点
  • 找到节点“code”
  • 设置新值(riasec1
英文:

When you call

currentUserId.child(UserId).setValue(user);

you are saying &quot;add WHOLE user in to node with name &#39;UserId&#39;&quot;.
In general you are fetching WHOLE User, updating one field and updating again.


So when would you like to update a child without rewriting the entire object u should pass node name, e.g.

currentUserId.child(UserId).child(&quot;code&quot;).setValue(riasec1);

In this call you say:

  • find node with proper ID (UserId)
  • find node &quot;code&quot;
  • set new value (riasec1)

huangapple
  • 本文由 发表于 2020年4月7日 06:34:44
  • 转载请务必保留本文链接:https://java.coder-hub.com/61070014.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定