首页 > 解决方案 > Firebase RealTime DB - 查询返回旧的 DataSnapshot - 而不是新键,除非重新启动应用程序

问题描述

我每次从排序的数据库中检索 10 个键。

FirebaseDatabase.DefaultInstance.GetReference("CarsForSale/")
   .OrderByKey().EndAt(lastSavedKey).LimitToLast(10).GetValueAsync()

它工作正常。但是当新项目添加到数据库中时,除非我重置应用程序,否则我无法检索这些新值。如果我不使用查询.OrderByKey().EndAt().LimitToLast,我会在不重置应用程序的情况下从数据库中获取新密钥

我的猜测是,当我在某个位置查询值时,它会在本地缓存它。我有一段时间的解决方案正在使用KeepSynced(true)并且它有效。

DatabaseReference dtr = FirebaseDatabase.DefaultInstance.GetReference(path);
dtr.KeepSynced(true);
dtr.OrderByKey().EndAt(lastKey).LimitToLast(10).GetValueAsync()

但这使我的应用程序非常慢,因为它会同步和缓存整个数据库引用。因此,我尝试仅对每个排序的 10 个键的查询应用 KeepSynced,但这没有意义。

我可以做些什么来确保当我从数据库中查询密钥以获取最新的密钥而无需重新启动我的应用程序或使其缓存变慢时?

标签: c#firebasefirebase-realtime-databasepersistence

解决方案


但是当新项目添加到数据库中时,除非我重置应用程序,否则我无法检索这些新值。

这是因为第GetValueAsync()一个从缓存中获取值,然后才更新缓存。这是一个令人讨厌的行为,不幸的是无法改变,我在这里解释了:Firebase Offline Capabilities and addListenerForSingleValueEvent。我也刚刚更新了 Android/iOS 上较新get/getData方法的答案,但我认为 C#/Unity SDK 中还不存在。

我在链接答案中解释的选项也适用于此处,因此我将关闭您的问题作为重复项。如果您还有其他问题,请在此处(如果是关于您的代码/C#)或那里(如果是关于一般缓存行为)发表评论。


推荐阅读