【问题标题】:Firebase Remote Config - check if value existsFirebase 远程配置 - 检查值是否存在
【发布时间】:2017-12-15 13:36:58
【问题描述】:

我想在我的应用中为一些布尔值实现某种代理。逻辑如下:

  1. 我从后端收到一组值
  2. 我也在 Firebase 中设置了其中一些值
  3. 在应用中使用值时,我首先检查它是否存在于 Firebase 中

    3.1。如果存在,取 Firebase 值

    3.2。如果不存在,取后端值

问题是 - 如何检查 Firebase 远程配置中是否存在该值?

【问题讨论】:

  • 请问这样做的用例是什么?你想通过这个来增强什么功能?
  • 或者,如果有人在远程配置默认值中搞砸了,您是否将其构建为备份?
  • 反过来——如果有人在后端搞砸了一些东西,我希望能够快速覆盖用户在他们的应用程序中获得的价值(因为我无法编辑后端和通常需要很长时间才能改变它)
  • 如果您在 defaults.xml 或远程配置控制台中都没有定义的键上执行 getString() 会发生什么?
  • 你会得到“”,这是我在下面发布的解决方案:D

标签: android firebase firebase-remote-config


【解决方案1】:

我找到了另一种方式,也许对其他登陆这里的人有用:

val rawValue = remoteConfig.getValue(key)
val exists = rawValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE

在这种情况下,exists 仅当值从远程返回时才为真(并且尚未设置为默认或静态提供的值)。接受的答案很容易出错,因为没有考虑空字符串是从远程返回的有效字符串的情况

这里是FirebaseRemoteConfigValue 的文档

【讨论】:

【解决方案2】:

我找到了解决办法:

Firebase 远程配置将所有值作为Strings 获取,然后才以方便的方法将它们映射到其他类型,例如getBoolean()getLong() 等。

因此,可以按如下方式检查布尔配置值是否存在:

String value = firebaseRemoteConfig.getString("someKey");

if(value.equals("true")){
    //The value exists and the value is true
} else if(value.equals("false")) {
    //The value exists and the value is false
} else if(value.equals("")) {
    //The value is not set in Firebase
}

其他类型也是如此,即在 firebase 上设置为 64 的 long 值将从 getString() 返回为 "64"

【讨论】:

  • 请注意,这仅在没有通过 setDefaultsAsync() 定义默认值时有效。当您确实定义了默认值时,getString() 将返回默认值。
【解决方案3】:

Firebase 远程配置 (FRC),实际上提供了 3 个常量来了解使用 getValue(forKey) (documentation) 检索到的值来自哪里

  • VALUE_SOURCE_DEFAULT --> 用户设置的默认值
  • VALUE_SOURCE_REMOTE --> 来自远程服务器的值
  • VALUE_SOURCE_STATIC --> 返回值为默认值(FRC 没有密钥)

知道了这一点,你可以像这样做一个“包装器”:

class FirebaseRemoteConfigManager {
.....

    override fun getBoolean(forKey: String): Boolean? = getRawValue(forKey)?.asBoolean()

    override fun getString(forKey: String): String? = getRawValue(forKey)?.asString()

    override fun getDouble(forKey: String): Double? = getRawValue(forKey)?.asDouble()

    override fun getLong(forKey: String): Long? = getRawValue(forKey)?.asLong()

    private fun getRawValue(forKey: String): FirebaseRemoteConfigValue? {
        val rawValue = remoteConfig.getValue(forKey)
        return if (rawValue.source == FirebaseRemoteConfig.VALUE_SOURCE_STATIC) null else rawValue
    }
...
}

如果您得到null,您就知道该密钥在 FRC 中不存在。 注意使用默认值作为“不存在”,因为可能在你的 FRC 中你想设置这个值,你会得到一个误报

【讨论】:

    【解决方案4】:

    远程配置已经这样做了,如documentation 中所述。您有义务为尚未在控制台中定义的参数提供default values。它们完全按照您的描述工作,无需做任何额外的工作。在您执行fetch 之前,将使用这些默认值。如果该值是在控制台中定义的,那么它将被使用而不是默认值。

    【讨论】:

    • 问题是,这些值是动态的。我希望能够在不重新部署应用程序的情况下添加 firebase 代理值。此外,没有义务根据我所看到的来定义默认值。它只返回该数据类型的默认值(false、“”或 0)
    • 我想我不明白你在做什么。什么是“firebase 代理值”?
    • 这些 firebase 值应该是主值。因此,如果firebase中有一个,请使用它。如果没有,请使用从后端检索到的那个。我希望能够迭代所有后端值,检查 firebase 中是否有覆盖,如果有就使用它。
    • 我不认为您将能够知道参数是否在控制台中具有值,除非您在控制台中放置一个特殊值来指示应用程序不要使用它。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2016-12-30
    • 2017-05-29
    相关资源
    最近更新 更多