【问题标题】:Can an offline user carry out database transactions specific to their uid in Firebase Realtime Database?离线用户能否在 Firebase 实时数据库中执行特定于其 uid 的数据库事务?
【发布时间】:2019-03-23 03:08:52
【问题描述】:

情况:

用户在没有互联网连接的情况下启动应用程序。我尝试在我的启动活动中对它们进行匿名身份验证,并在具有以下规则结构的数据库中对参考 '/users/$uid' 执行数据库写入:

{
  "rules": {
    "users": {
      "$user_id": {
        ".write": "$user_id === auth.uid",
        ".read": "$user_id === auth.uid"
      }
    }
  }
}

那么,如果出现这种情况,然后用户上线,排队的数据库事务是否会真正执行——还是我需要手动重新验证并重试数据库事务?

我不确定如果用户离线是否会生成用于匿名身份验证的uid,所以我认为无法解析数据库引用。

参考链接:

https://firebase.google.com/docs/auth/android/anonymous-auth https://firebase.google.com/docs/database/android/offline-capabilities

【问题讨论】:

  • 是否值得寻找不同的 本地 存储解决方案,而不是使用实时数据库,因为未经身份验证的用户尝试将数据库写入这种结构的数据库的风险并且丢失交易(例如跨应用重启)会很高?
  • 您是否尝试过禁用 4g 移动数据,然后在登录您的应用程序之前拔掉调制解调器,然后重新插入以查看数据是否已发送?
  • 如果我禁用设备的互联网连接,执行通常需要授权/触发数据库事务的操作,则数据库不受影响。 编辑:这发生在简单地重新激活互联网连接和重新启动应用程序,然后重新激活互联网连接时。

标签: android firebase firebase-realtime-database firebase-authentication offline-caching


【解决方案1】:

我会将数据保存在 sharedpreferences 或本地数据库中(取决于您要保存的数据类型)。

然后启动后台服务并尝试每 10 分钟连接到您的实时数据库,或者您希望用户下次打开应用时检查是否需要检查任何身份验证。

对于后台服务,我会推荐 AlarmManger。

【讨论】:

  • 我希望保存的对象是 POJO,而不仅仅是像 intString 等简单的原始类型,所以我需要一个完整的其他类型与 Firebase 一起使用的数据库解决方案——这正是我想要避免的。感谢您尝试回答。
  • 另外,不幸的是 AlarmManager 不会保留应用/设备重启之间的预期工作。我对此进行了研究——在 API 21 之上,通常建议使用 WorkManager Android 架构组件。但是,还有其他选项,例如 Evernote 的 android-job 库。
【解决方案2】:

所以,经过测试,我发现:

  • 如果用户一开始就没有连接,则在重新启动之间不能依赖 uid
  • 在本地执行的数据库事务 - 因为您有 setPersistence(true) - 将排队并与远程同步,无论用户是否具有连接性,但如果使用的 DatabaseReference 包含对当前用户的 uid 的引用,则不会,因为在重新启动之间不能依赖这一点(例如在问题中描述的场景中)。

为了解决这个问题,我通过 SharedPreferences 使用本地存储来存储最基本的数据,并在实例化引用用户 uid 的 DatabaseReference 之前等待连接。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多