在 Firebase 实时数据库中,当我更新值时,它会立即恢复为旧值

Posted

技术标签:

【中文标题】在 Firebase 实时数据库中,当我更新值时,它会立即恢复为旧值【英文标题】:In Firebase Realtime Database when I update values, it returns to old values immediately 【发布时间】:2020-12-25 22:34:15 【问题描述】:

我正在创建一个任务提醒应用并将数据存储在 Firebase 数据库中的 users->userUid->email、username、Tasks 下。 Tasks 下面是他创建的每个任务。任务被命名为 "Task"+keyTask ,其中 keyTask 是一个随机整数。

问题是每当我使用以下方式更新任务时:

EditText titleEditText, descEditText, dateEditText;
DatabaseReference reference;
FirebaseAuth mAuth;
String oldTitle, oldDesc, oldDate, oldKey;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_task);
    
    
    mAuth = FirebaseAuth.getInstance();
    reference = FirebaseDatabase.getInstance().getReference().child("users").child(mAuth.getCurrentUser().getUid()).child("Tasks");

    Intent intent = getIntent();

    titleEditText = findViewById(R.id.titleUpdate);
    descEditText = findViewById(R.id.descUpdate);
    dateEditText = findViewById(R.id.dateUpdate);

    oldTitle = intent.getStringExtra("titleTask");
    oldDesc = intent.getStringExtra("descTask");
    oldDate = intent.getStringExtra("dateTask");
    oldKey = intent.getStringExtra("keyTask");

    titleEditText.setText(oldTitle);
    dateEditText.setText(oldDate);
    descEditText.setText(oldDesc);


public void saveClicked(View view)
    final String newTitle = titleEditText.getText().toString();
    final String newDesc = descEditText.getText().toString();
    final String newDate = dateEditText.getText().toString();
    final String newKey = oldKey;
    HashMap<String, Object> map = new HashMap<>();
    map.put("titleTask", newTitle);
    map.put("dateTask", newDate);
    map.put("descTask", newDesc);
    map.put("keyTask", newKey);
    reference.child("Task"+newKey).updateChildren(map);

我可以看到,数据库将值更改为新值并立即再次返回旧值。 此外,当我使用 removeValue() 删除一个完整的任务时,数据库将其删除并立即自行重新添加。有人知道这里会发生什么吗?

【问题讨论】:

如果没有关于您确切看到的情况的更多信息,很难说比我最初的回答更多。例如:“我看到数据库将值更改为新值并立即再次返回旧值。”你在哪里看到这个?是否有任何其他进程可能正在运行?你enabling debug logging,如果是:它在 logcat 输出中显示了什么? 您在哪里看到的:正是我的图片显示的位置,它们变成橙色,变为新值并立即再次恢复到旧值。任何其他正在运行的进程:根本没有,您可以看到它只是一个非常基本的 onClick 方法。 我告诉过你的案例是导致这种行为的常见原因,所以很难说。正如我在上一条评论中所说,您是否启用了调试日志记录并检查其输出? 我不确定我应该把 log.i 放在哪里,或者我应该期待什么,因为它不会带来任何错误。我也尝试添加 OnCompleteListener 并检查任务是否失败,但没有。 如果完成侦听器发出写入成功的信号,则确实不会被安全规则拒绝。在这种情况下,我能想到的将数据改回的唯一原因是另一个客户端执行写操作。您需要在 那个 方向进行搜索,例如尝试在数据库的不同部分重现问题。 【参考方案1】:

听起来您的数据库的安全规则正在拒绝更新/删除操作。如果发生这种情况,客户端会在服务器告诉它不允许操作之前短暂显示更新的值。

这是预期行为,因此如果您想阻止它,您必须授予用户访问权限以执行更新/删除,执行与您的安全规则相同的检查在您的应用程序代码中。

【讨论】:

创建数据库后我做的第一件事就是将规则设置为 "rules": ".read": true, ".write": true 还有什么我遗漏的吗?

以上是关于在 Firebase 实时数据库中,当我更新值时,它会立即恢复为旧值的主要内容,如果未能解决你的问题,请参考以下文章

React Native 和 Firebase 实时数据库

Android Firebase FireStore实时更新分页

如何使用 Cloud Functions for Firebase 更新 Firebase 实时数据库中的值

Google Firebase实时数据库updateChildren()方法不起作用? [关闭]

使用 Firebase 实时数据库 Flutter 进行实时更新

在 Swift 中更新 Firebase 实时数据库中的父标题