是否可以将服务器端逻辑添加到firebase以实现自动增量密钥?

时间:2015-10-14 17:57:31

标签: ios firebase

我是firebase的新手,我正在尝试实现iOS聊天应用。我想知道是否有办法在收到的消息中添加增量ID。

例如: 我将以下消息发送到firebase

 {date:  "2015-10-14T04:30:43", name: "Jacob" text:"Hi"  userId: "y8jFdNwRAX" }

firebase是否可能向其添加messageId键

 {msgId:1, date:  "2015-10-14T04:30:43", name: "Jacob" text:"Hi"  userId: "y8jFdNwRAX"};

如果我发送另一个消息,firebase会添加msgId并将其增加1:

 {msgId:2, date:  "2015-10-14T04:31:40", name: "Jacob" text:"morning"  userId: "y8jFdNwRAX"};

不确定firebase是否可以这样做?任何帮助表示赞赏。提前谢谢。

3 个答案:

答案 0 :(得分:6)

所以问题的答案是否定的,它不会发生在某种自动服务器端逻辑上。而且,这一般是一个坏主意。

有一些方法可以模拟一个计数器,但它可能真的很难处理,并且有很多方法可以出错,它只是不好的代码。

所以我建议寻找另一个解决方案:

也许每条消息都有一个跟踪它是否被读取的子节点?

message_id_1
  timestamp: "2015-10-14T04:30:43"
  name: "Jacob"
  text: "Hi"
  userId: "y8jFdNwRAX"
  read: "yes"
message_id_2
  timestamp: "2015-10-14T04:30:50"
  name: "Bob"
  text: "Hi Back At Ya"
  userId: "y9jaksjk"
  read: "no"

你甚至可以阅读'节点和未读的'节点

read_messages
     message_id_1
      timestamp: "2015-10-14T04:30:43"
      name: "Jacob"
      text: "Hi"
      userId: "y8jFdNwRAX"

unread_messages
      message_id_2
        timestamp: "2015-10-14T04:30:50"
        name: "Bob"
        text: "Hi Back At Ya"
        userId: "y9jaksjk"

这是一个棘手的问题:将消息存储在自己的节点中,并在用户节点中引用那些未读的消息

all_messages
 message_id_1
  timestamp: "2015-10-14T04:30:43"
  from_userId: "y9jaksjk"
  text: "This is message 1"
 message_id_2
  timestamp: "2015-10-14T04:30:50"
  from_userId: "y9jaksjk"
  text: "this is message 2"

users
  "y8jFdNwRAX"
     my_unread_messages:
       message_id_1: true

(message_id_1:true保存为用户的子级是一个引用,指示该消息是针对该用户的,但尚未读取。读取时,删除引用。)

所有这些都是猜想,因为我们不知道应用的范围和消息的使用。

您可能希望更多地访问文档,并查看为其他选项提供的一些示例代码。

答案 1 :(得分:0)

如果有人有同样的问题。我使用时间戳作为" messageId"在服务器端跟踪订单(可能不是一个好主意,但它解决了我需要的东西),你可以创建' .indexon'在这个" messageId"在安全规则中获得更好的性能。

以下是安全规则的示例:

{
"rules": {
    "Messages":{           
        "$Message":{
            ".indexOn": "messageId"
          }
     }
}

在iOS中设置代码:

msg[@"messageId"] = kFirebaseServerValueTimestamp;

请注意,Firebase可能存在错误:您从FEventTypeChildAdded收到的时间戳似乎与Firebase DB中保存的时间戳有所不同(几百ms差异)。

答案 2 :(得分:0)

由于其他原因,我遇到了同样的问题

递增的密钥可以通过交易来实现: https://www.firebase.com/docs/ios/api/#firebase_runTransactionBlock

swift的一个例子:

let messagesRef = ...
let counterRef = ... //you need to keep the count of messages
counterRef.runTransactionBlock({ (currentData) -> FTransactionResult! in
        var value = currentData.value as? Int
        if (value == nil) {value=0}
        currentData.value = value! + 1
        return FTransactionResult.successWithValue(currentData)
        }) { (error, commited, snap) -> Void in
            if error != nil {
                print(error)
            }
            if commited {
                //if increment is made set message
                let messageInfo = .... 
                messagesRef.childByAppendingPath(snap.value).setValue(messageInfo)
    }

如果唯一的目标是排序,那么childbyautoid函数就足够了,因为它会相应地创建密钥

messagesRef.childByAutoId().setValue(messageInfo)

希望这有助于某人