如何使用firebase实时数据库ios在特定节点中增加值



我在一个聊天应用程序中工作,我想维护接收方的未读计数。控制台中的json结构看起来像

user_history
|
|--> user_a_uuid
|-> last_msg
|-> last_msg_timestamp
|-> unread_count

这个问题的范围是,如何增加unread_count的值。先前递增i具有CCD_ 2和节点CCD_;CCD_ 4作为常数。所以我试了如下

dbRef.child("user_history")
.child(user_a_uuid)
.child("unread_count")
.runTransactionBlock { (unreadCount) -> TransactionResult in 
var value = unreadCount.value as? Int
if value == nil {
value = 0
}
unreadCount.value = value! + 1
return TransactionResult.success(withValue: unreadCount)
}

事实上,准确地说,我从这里借用了这个解决方案。我也试着跟随医生。但问题是,我不想像在文档中那样在根节点上运行事务。我只想在unread_count单据上运行交易。

我面临的问题:

尝试此代码后,我面临的问题是,unread_count节点很快被删除,当我在完成块内返回TransactionResult时,它添加了unread_count。问题是由于unread_count被删除,该值没有增加。它总是停留在1

提前谢谢。

您似乎希望在不影响节点中其他项的情况下增加存储在节点中的计数器。根据问题中的信息,由于计数存储在代码中,因此在本用例中似乎不需要使用事务块。

在递增之前,我有user_a_uuid和节点user_history&unread_count作为常量

我认为这意味着您将unread_count存储在代码中的变量中,因此如果这是正确的,只需在代码中增加它并将其写入节点即可。

从重复结构开始:

user_history
uid_0
last_msg: "some message"
last_msg_timestamp: "20181028075700"
unread_count: 2

现在我们添加了另一条消息。var需要递增,然后需要用新值更新Firebase中的相应节点。这是实现这一点的代码:

func updateMsgCount() { 
self.unread_count += 1 //this is a class var or however it's stored in code
let unreadCountRef =  self.ref.child("user_history").child("uid_0").child("unread_count")
unreadCountRef.setValue(self.unread_count)

然而,假设unread_count没有存储在代码中,而是只存储在Firebase中。以下是要在unread_count节点中读取的代码,增加计数并将其存储回Firebase中。

func updateCount() {
let unreadCountRef = self.ref.child("user_history").child("uid_0").child("unread_count")
unreadCountRef.observeSingleEvent(of: .value, with: { snapshot in
var currentCount = snapshot.value as? Int ?? 0
currentCount += 1
unreadCountRef.setValue(currentCount)
})
}

如果你真的需要一个交易块,这里有一个可以完成同样的事情

func updateCountTransactionStyle() {
let unreadCountRef = self.ref.child("user_history").child("uid_0").child("unread_count")
unreadCountRef.runTransactionBlock( { (currentData: MutableData) -> TransactionResult in
var currentCount = currentData.value as? Int ?? 0
currentCount += 1
currentData.value = currentCount
return TransactionResult.success(withValue: currentData)
})
}

最新更新