【问题标题】:FireBase TIMESTAMP undesirably updatesFireBase TIMESTAMP 意外更新
【发布时间】:2020-06-24 05:27:09
【问题描述】:

我的想法是允许用户在他的用户列表中添加东西。当用户点击复选框时,它会在 FireBase 数据库中创建一个包含数据的项目(我希望将来按时间对用户列表进行排序)。

我通过以下代码这样做:

favCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(b){
                    //Add item
                    favMap.put("comicsId", comicsId);
                    favMap.put("comicsGenreId", comicsGenreId);
                    favMap.put("comicsTitle", comicsTitle);
                    favMap.put("time", ServerValue.TIMESTAMP);
                    favListRef.setValue(favMap);
                }
                if(!b){
                    //Remove item
                    favListRef.removeValue();
                }
            }
        });

为了检查复选框(如果用户之前已经添加过项目)我使用代码:

//Check if already added
        favListRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
                    if(dataSnapshot1.getValue() != null && !dataSnapshot1.getValue().equals("")){
                        //Item already added set as checked
                        favCheckBox.setChecked(true);
                    }
                }
            }

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

所以一切都很好,除了每次“检查器”代码发现一个项目已经添加时,它会将复选框设置为选中,然后在数据库更新中时间(这破坏了我按时间排序的想法)。

如何使用 FireBase 数据库实现“TIMESTEAMP”的想法,而不是在每次检查后更新时间?

希望看到您的回答和建议。提前致谢。

【问题讨论】:

  • 对复选框使用单击侦听器而不是 oncheck 更改:stackoverflow.com/a/14307643/2711811。这意味着 firebase 回调将其设置为已选中,但只有当用户物理单击时才会调用按钮回调。还有另一个答案,它使用复合按钮上的“isPressed”选择器使用 onCheckedChanged - 再次区分用户和代码设置复选框。
  • 非常感谢。我通过 onClickListener 和一些布尔值处理它,现在它工作正常。

标签: java android firebase firebase-realtime-database timestamp


【解决方案1】:

感谢安迪。

为了处理我通过 onClickListener 添加和删除项目的问题:

boolean checkBoxChecked;
...
//ClickListener
        favCheckBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(checkBoxChecked){
                    //Remove item
                    favListRef.removeValue();
                    checkBoxChecked = !favCheckBox.isChecked();//false
                }
                if(!checkBoxChecked){
                    //Add item
                    favMap.put("comicsId", comicsId);
                    favMap.put("comicsGenreId", comicsGenreId);
                    favMap.put("comicsTitle", comicsTitle);
                    favMap.put("time", ServerValue.TIMESTAMP);
                    favListRef.setValue(favMap);
                    checkBoxChecked = favCheckBox.isChecked();//true
                }
            }
        });

        //Check if user already added item
        favListRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
                    if(dataSnapshot1.getValue() != null && !dataSnapshot1.getValue().equals("")){
                        //Item was added
                        favCheckBox.setChecked(true);
                        checkBoxChecked = favCheckBox.isChecked();//true
                    }
                }
            }

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

TIMESTAMP 仅在用户单击复选框时更改。

【讨论】:

  • 很高兴它有帮助 - 实际上你不需要布尔值,因为你可以在 onClick(View view) 回调中将 view 转换为 CompoundButton 并使用它的 isChecked - 因为你知道它一个复选框(这是一个复合按钮)。顺便说一句 - 你的帖子包括 <!-- language: lang-js --> 这是不正确的 - 它是 java - 所以 sn-p 的东西不起作用。
猜你喜欢
  • 2016-02-18
  • 2011-11-16
  • 2023-03-21
  • 2020-10-28
  • 2019-10-02
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多