离线用户能否在 Firebase 实时数据库中执行特定于其 uid 的数据库事务?
Can an offline user carry out database transactions specific to their uid in Firebase Realtime Database?
情况:
用户在没有互联网连接的情况下启动应用程序。我尝试在我的启动 activity 中匿名验证它们并执行数据库写入到引用 '/users/$uid',在具有此规则结构的数据库中:
{
"rules": {
"users": {
"$user_id": {
".write": "$user_id === auth.uid",
".read": "$user_id === auth.uid"
}
}
}
}
因此,如果发生这种情况并且用户随后上线,排队的数据库事务是否会实际执行 - 或者我是否需要手动重新验证并重试数据库事务?
不确定用户离线时是否会生成匿名认证的uid,所以没有觉得数据库引用可以解决
Reference links:
https://firebase.google.com/docs/auth/android/anonymous-auth
https://firebase.google.com/docs/database/android/offline-capabilities
我会将数据保存在 sharedpreferences 或本地数据库中(取决于您要保存的数据类型)。
之后要么启动后台服务并尝试每 10 分钟连接到您的实时数据库,要么您希望用户下次打开应用程序时检查是否需要检查任何身份验证。
对于后台服务,我推荐AlarmManger。
所以,在测试之后,我发现:
- 如果用户一开始就没有连接,则在重新启动之间不能依赖 uid
- 本地执行的数据库事务——因为你有 setPersistence(true)——将排队并与远程同步,无论用户是否有连接,但如果使用的 DatabaseReference 包含对当前数据库的引用则不会用户的 uid,因为在重启之间不能依赖它(例如在问题中描述的场景中)。
为了解决这个问题,我通过 SharedPreferences 使用本地存储来存储最基本的数据,并在实例化引用用户 uid 的 DatabaseReference 之前等待连接。
情况:
用户在没有互联网连接的情况下启动应用程序。我尝试在我的启动 activity 中匿名验证它们并执行数据库写入到引用 '/users/$uid',在具有此规则结构的数据库中:
{
"rules": {
"users": {
"$user_id": {
".write": "$user_id === auth.uid",
".read": "$user_id === auth.uid"
}
}
}
}
因此,如果发生这种情况并且用户随后上线,排队的数据库事务是否会实际执行 - 或者我是否需要手动重新验证并重试数据库事务?
不确定用户离线时是否会生成匿名认证的uid,所以没有觉得数据库引用可以解决
Reference links:
https://firebase.google.com/docs/auth/android/anonymous-auth https://firebase.google.com/docs/database/android/offline-capabilities
我会将数据保存在 sharedpreferences 或本地数据库中(取决于您要保存的数据类型)。
之后要么启动后台服务并尝试每 10 分钟连接到您的实时数据库,要么您希望用户下次打开应用程序时检查是否需要检查任何身份验证。
对于后台服务,我推荐AlarmManger。
所以,在测试之后,我发现:
- 如果用户一开始就没有连接,则在重新启动之间不能依赖 uid
- 本地执行的数据库事务——因为你有 setPersistence(true)——将排队并与远程同步,无论用户是否有连接,但如果使用的 DatabaseReference 包含对当前数据库的引用则不会用户的 uid,因为在重启之间不能依赖它(例如在问题中描述的场景中)。
为了解决这个问题,我通过 SharedPreferences 使用本地存储来存储最基本的数据,并在实例化引用用户 uid 的 DatabaseReference 之前等待连接。