java - 如何优雅地支持firebase数据库上的数据类型更改?

标签 java android firebase firebase-realtime-database kotlin

使用 Firebase 实时数据库快速启动项目并使其启动和运行非常棒。

但是,当项目处于 Activity 状态时,有时,稍后您需要更新自定义对象模型的数据类型,事情可能会变得不太好。

比方说,我使用以下模型启动了该项目(kotlin 示例):

@Parcelize
data class CustomModel (
    var customField: Int = 0,
)

customField 表示 boolean 值 0 或 1,但作为数字

几周后,我意识到这个字段可能应该是 boolean 类型的字段(firebase 原生支持)

所以我想把上面的模型改成:

@Parcelize
data class CustomModel (
    var customField: Boolean = false,
)

问题是,我已经为我的 customField (Int) 添加了一些旧格式的数据到我的文档存储中

并使用firebase DataSnapshot的方法:

@PublicApi
public <T> T getValue(@NonNull Class<T> valueType)

导致com.google.firebase.database.DatabaseException:无法将 java.lang.Int 类型的值转换为 boolean 值

所以问题很简单,我们如何在 Firebase 中处理数据库架构迁移?

我知道我可以捕获异常,但我需要真正添加一些自定义转换逻辑,以便将这些整数转换为 boolean 值,反之亦然,以便向后兼容旧客户端

最佳答案

我能想到的最简单的解决方案是更改属性的数据类型。这可以通过查询数据库以获取该特定属性的所有值并将其根据您的逻辑存储为 boolean 值来完成。如果值为0则存储false,如果值为1则存储true。获得值后,只需删除该属性并使用正确的( boolean )数据类型再次添加它即可。

编辑:如果您的应用已发布,那么您是对的,您无法通过一步完成此操作。在这种情况下,您应该仅在用户打开应用程序时进行更改。流量是多少?您可以使用以下机制进行更新:

创建应用的新版本,您可以在其中选择转换属性的数据类型。用户读取该子项后,获取 Int 形式的值,将其存储在 boolean 变量中,删除该属性并再次正确添加。

这样,使用旧版本应用的用户将不会受到影响,因为他们使用的是 Int 属性,而使用新版本应用的用户将使用数据正确。

关于java - 如何优雅地支持firebase数据库上的数据类型更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54751675/

相关文章:

java - java中对象的依赖关系

Android,轮询数据时如何处理网络变化(从 GPRS 到 Wi-fi,反之亦然)

Swift Firebase 函数错误 : NSCocoaErrorDomain

firebase - 在BigQuery中支持西里尔文数据

android - Firebase 身份验证限制

Java:如何为 TextField 执行 "onclick"?

java - Linux 中的 Spring PropertyPlaceholderConfigurer

java - Camel : Bean Proxy to CXF Endpoint

android - MainActivity 类型未定义方法 getActivity()

android - Unresolved Espresso 方法