在单个值上使用 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
的一些描述。
这里有几件事:
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,
}
}
如果没有明确的方法来保证项目数据的唯一性(在这种情况下是宠物的名字),那么您就有了一个唯一标识符
我对 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
的一些描述。
这里有几件事:
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,
}
}
如果没有明确的方法来保证项目数据的唯一性(在这种情况下是宠物的名字),那么您就有了一个唯一标识符