java - FireBase TIMESTAMP 意外更新
问题描述
我的想法是允许用户在他的用户列表中添加东西。当用户单击复选框时,它会在 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”理念,而不是在每次检查后更新时间?
想看看你的答案和建议。提前致谢。
解决方案
感谢安迪。
为了解决这个问题,我通过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 仅在用户单击复选框时更改。
推荐阅读
- c# - 为 Outlook 2016 安装插件时出现问题
- html - 如何从右侧缩进文本?
- react-native - Expo android构建到脚本中
- flask - SQLAlchemy/Flask MSSQL Query 在 Apache 下运行时无限期挂起
- php - 类名必须是有效的对象或字符串
- c# - 如何在 C# 中为私有集设置值
- jpa - 如果 id 不在数据库中,如何在 Transaction-Scoped Persistence 上下文中找到它
- cordova - 无法在表中插入记录
- spring-boot - Spring Boot JMS Producer 中的错误:AMQ212054 目标地址被阻止
- javascript - 使用 lodash 合并数组