更新 Firebase 实时数据库中的现有数据

Posted

技术标签:

【中文标题】更新 Firebase 实时数据库中的现有数据【英文标题】:Updating existing data in Firebase real time database 【发布时间】:2020-11-10 12:07:07 【问题描述】:

我想说明如何。

 - users
      - 12313123
          - isAuth: "True"
          - didPay: "True"
      - ...

所以用户类看起来像:

class User(
    val isAuth: String,
    val didPay: String
    ...
)

我已经有 100 倍的现有用户。现在如何向我的User 模型类添加一个会自动添加到所有用户的属性?我是否必须为“创建”新用户进行更改 + 自动运行一个函数来更新所有现有用户,还是有更简单的方法?

class User(
    val userName: String,
    val isAuth: String,
    val didPay: String
    ...
)

【问题讨论】:

您的意思是要使用新属性的值更新数据库中的用户? 我想修改现有的模型类 - 向对象类添加额外的参数。我是否必须进行一些迁移 - 这对于本地数据库来说是正常的场景 “我必须做一些迁移”是什么意思? 当您的数据类模型更改(添加新参数/字段)时的正常场景,您需要迁移(例如对于本地数据库,例如空间)以确保使用先前数据库版本的用户不会崩溃.我在问如何更改现有的用户数据库字段,以便当我为数据库中还没有此类字段的用户调用相同的代码时它们不会在 npe 中运行(只有新创建的用户会有新字段 - 会发生什么老用户?) 【参考方案1】:

根据你上一条评论:

当您的数据类模型更改(添加新参数/字段)时,您需要迁移(例如对于本地数据库,例如空间)以确保使用先前数据库版本的用户不会崩溃。我在问如何更改现有的用户数据库字段,以便当我为数据库中还没有此类字段的用户调用相同的代码时它们不会在 NPE 中运行(只有新创建的用户会有新字段 - 什么老用户会这样吗?)

有两种解决方案。第一个是始终对照null 检查属性的值。但是,现在这可能无法解决问题,因为我知道您的应用程序的旧版本不会这样做。

第二种解决方案是使用默认数据更新所有文档中的所有属性。这样,您将无法获得NullPointerException,因为所有属性都将保存值。使用 POJO 类时,请查看我在以下帖子中的回答:

How to update one field from all documents using POJO in Firestore?

否则,请使用以下代码行:

val rootRef = FirebaseFirestore.getInstance()
val usersRef = rootRef.collection("users")
usersRef.get().addOnCompleteListener  task ->
    if (task.isSuccessful) 
        for (document in task.result!!) 
            document.reference.update(
                "newFieldOne", "DataOne",
                "newFieldTwo", "DataTwo"
            )
        
    

对于 Java 用户:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
usersRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) 
        if (task.isSuccessful()) 
            for (DocumentSnapshot document : task.getResult()) 
                document.getReference().update(
                        "newFieldOne", "DataOne",
                        "newFieldTwo", "DataTwo"
                );
            
        
    
);

【讨论】:

以上是关于更新 Firebase 实时数据库中的现有数据的主要内容,如果未能解决你的问题,请参考以下文章

如何通过本机反应将新字段数据更新到现有文档而不覆盖firebase-9中的现有数据

一文读懂大数据实时计算

如何使用 Cloud Functions for Firebase 更新 Firebase 实时数据库中的值

课程预告:大数据实时处理系统Apache Storm

.NET 大数据实时计算--学习笔记

基于Storm与Cassandra的实时计算与大数据实践