实时数据库返回已删除的值 [已编辑]

问题描述

删除数据库中的所有内容。然后,我查询了刚刚删除的数据,得到了结果!这怎么可能?

我使用的是实时数据库 Unity SDK。出于测试目的,我想定期清除整个数据库并用新数据填充它。想象一下当我的查询返回一些旧的、已删除的数据时我的惊讶。就好像被删除的数据存在于某个仍然可以访问的空隙中。

我几天来一直在修补这个问题。这是我的步骤:

  1. 我正在使用自动生成唯一键的 GetReference(item).Push().Key;

  2. 我用 item 将新的 GetReference(item).SetValueAsync() 写入数据库

  3. 我检查了我的 Firebase 控制台,确实,数据记录正确。

  4. 我创建了一个返回 item JSON 值的查询。我工作正常。

  5. 我从数据库删除item

  6. 我再次运行查询并返回 item。项目不应再存在!

出于好奇,我编写了一个查询来返回我数据库中的所有数据(应该是空的),它返回我在过去几天创建的每个对象。这实际上是数百个项目......来自一个数据库

删除后的数据好像还存在几天。

意识到这一点后,我决定测试如果我手动创建一个使用已删除对象之一的现有密钥的对象会发生什么。

我的查询返回新对象。好极了! 我休息一下,15 分钟后回来。我再次运行确切的查询。我得到的是旧的、已删除的对象,而不是新的。到底是怎么回事?

此时我在质疑实时数据库是否是真正的数据库。它似乎打破了一致性和完整性的规则。

我还考虑过我可能会错误删除数据。我主要是通过浏览器手动完成的。我也试过 RemoveValueAsync()SetRawJsonValueAsync(null)。似乎没什么区别。

拜托,拜托,有人能告诉我这是怎么回事吗?我将永远感激。


编辑:事实证明幻象数据来自我设备上的缓存。关闭持久性解决了这个问题。显然,多次执行相同的查询只会在第一次检索数据库的数据。后续查询会查看缓存。

解决方法

事实证明,幻象数据来自我设备上的缓存。关闭持久性解决了这个问题。显然,多次执行相同的查询只会在第一次检索数据库的数据。后续查询会查看缓存。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...