在单个值上使用 childByAutoId?

Using childByAutoId On Single Value?

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

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

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

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

或者我必须这样做:

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

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

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

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

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

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

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

这里有几件事:

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

最好的学习方法就是尝试

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

dbRef:{
  numEvents:1
}

而第二个将是

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

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

例如

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

如果没有明确的方法来保证项目数据的唯一性(在这种情况下是宠物的名字),那么您就有了一个唯一标识符