【问题标题】:Using childByAutoId On Single Value?在单个值上使用 childByAutoId?
【发布时间】:2016-06-03 14:51:47
【问题描述】:

我对 Swift 和 Firebase 都很陌生,我正在尝试使用 Firebase 作为后端来制作一个简单的应用程序。据我所知,没有内存有效的方法来使用 numChildren() 函数而不将每个子项加载到内存中进行计数,因此我正在实现自己的简单计数器来计算已创建的“事件”数量我的应用程序。

Firebase 的文档指出 childByAutoID() 方法应该用于更新多用户应用程序中的列表。我假设它为请求的更新添加时间戳并按顺序执行。

我的问题是在多用户应用程序中仅更新单个字段时是否有必要使用 childByAutoID()。也就是说,如果我这样做,我的 numEvents 字段会不会有冲突:

dbRef = FIRDatabase.database().reference()
dbRef.child("numEvents").setValue(num)

或者我必须这样做:

dbRef = FIRDatabase.database().reference()
dbRef.child("numEvents").childByAutoId().setValue(num)

为了避免写冲突?我唯一真正的困惑是 childByAutoID 的文档强调当孩子是项目列表时它很有用,但我的只是一个项目。

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    如果您只更新单个字段,则不应使用childByAutoId。要更新对象的子值,您需要以某种方式获取对该对象的引用,可能是通过某种查询(在许多情况下,如果需要更改对象,您自然已经拥有对该对象的引用)并且您可以像这样改变值:

    dbRef.child("events").child(objectToUpdateId).child(fieldToUpdateKey).setValue(newValue)
    

    childByAutoId 在此上下文中将用于创建一个新字段,例如:

    dbRef.child("events").childByAutoId().setValue(newObject)
    

    我不确定这如何适用于您的情况,但这些是有关如何更新字段和使用 childByAutoId 的一些描述。

    【讨论】:

      【解决方案2】:

      childByAutoId 所做的是为节点创建一个唯一键,以避免多次使用相同的键,然后创建数据冲突,如不一致(不是写冲突),以避免使用事务块的写冲突。

      最好的学习方法是尝试一下

      如果 num == 1 ,在第一个示例中,结果将是

      dbRef:{
        numEvents:1
      }
      

      第二个将是

      dbRef:{
        numEvents:{
          //The auto-generated key
          KLBHJBjhbjJBJHB:1
        }  
      }
      

      如果你想在一个节点中保存多个相同类型的子节点,childByAutoId 会很有用,这样每个子节点都有自己的唯一标识符

      例如

      pet:{
        KJHBJJHB:{
          name:fluffy,
          owner:John Smith,
        },
        KhBHJBJjJ:{
          name:fluffy,
          owner:Jane Foster,
        }
      } 
      

      这样,当物品数据没有明确的方式来保证它是唯一的(在这种情况下是宠物的名字)时,你就有了一个唯一的标识符

      【讨论】:

        【解决方案3】:

        这里有几件事:

        1. childByAutoId 不是时间戳。但是用于在任何给定节点中创建唯一节点。

        childByAutoId 的用例:

        您有messages 节点,该节点存储来自参与群聊的多个用户的消息。所以每个用户都可以在群聊中添加消息,这样每次用户发送消息时你都会做这样的事情:

        dbRef = FIRDatabase.database().reference()
        
        dbRef.child("messages").childByAutoId().setValue(messageText)
        

        因此,这将为来自不同用户的每条消息创建一个唯一的消息 ID。这有点像普通数据库中消息的主键。

        数据库的结构是这样的:

        messages: {
           "randomIdGenerated-12asd12" : "hello",
           "randomIdGenerated-12323D123" : "Hi, HOw are you",
        }
        

        所以在你的情况下,你的第一种方法已经足够好了!由于您不需要唯一节点来计算添加的事件数。

        【讨论】:

        • 虽然childByAutoId 不是时间戳,但它基于时间戳,这允许它们按时间顺序排列?
        猜你喜欢
        • 2017-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2016-06-14
        • 1970-01-01
        • 2018-06-01
        相关资源
        最近更新 更多