2015-10-14 9 views
0

我是firebase的新手,我試圖實現一個iOS聊天應用程序。我想知道是否有一種方法來將增量ID添加到收到的消息。可以將服務器端邏輯添加到firebase以實現自動增量密鑰嗎?

例如: 我發送以下信息,以火力

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

這有可能是火力添加MESSAGEID鑰匙。

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

,如果我再派味精,火力補充的msgId並將其增加1:

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

不確定fireba se可以做或不做?任何幫助表示讚賞。先謝謝你。

+3

答案很有用。但是,msgId的功能是什麼?如果您正在進行某種訂購,則可以使用日期戳。通過在子節點中存儲一個值,你也可以在代碼中實現增量(大約有100種方法)。或者甚至是存儲該值的單獨節點,並且可以在添加帖子時增加。 – Jay

+0

@FrankvanPuffelen服務器端邏輯? – Jay

+1

沒有。但是做這樣的增量是一個壞主意,不管你是在客戶端還是在服務器端。 'push()'存在是有原因的,理由在文檔中有解釋。 –

回答

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:。真保存爲用戶的孩子是指示該消息是用於該用戶和未被讀取時讀取,刪除基準的基準)

所有這些都是猜測,因爲我們不知道應用程序的範圍和消息的使用。

您可能想要多訪問一些文檔並查看一些爲其他選項提供的示例代碼。

+0

非常感謝,@Jay。我正在考慮在郵件中添加「讀取」鍵,但如果這是一個羣組聊天,它將需要郵件的多個副本。所以這就是爲什麼我更喜歡有序的消息ID。我能否假設在Firebase中實現服務器邏輯是不可能的?因爲到目前爲止我沒有找到這樣的例子。 –

+0

這通常是正確的。即使可用,其他提供的方法也可能是更好的解決方案。儘管您可以製作多個消息副本(Firebase中的數據重複爲A-OK),但您可能需要考慮其他解決方案:可能是用戶節點中的「unread_messages」子節點,其中包含用戶未讀取消息的引用。一旦閱讀,從他的節點刪除message_id - 類似於上面的最後一個例子。 – Jay

+0

我不會說,答案是否定的。實際上,它可以通過安全規則完成客戶端:http://jsfiddle.net/firebase/xLq7grcc/它仍然不是最好的計劃,通常可以解決錯誤的問題。推送ID通常是更好的選擇。 – Kato

0

如果有人有同樣的問題。我在服務器端使用timestamp作爲一種「messageId」來跟蹤訂單(可能不是一個好主意,但它解決了我需要的),並且可以在安全規則的這個「messageId」上創建'.indexon'以獲得更好的性能。

這裏是安全規則的例子:

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

設置代碼在iOS設備上:

msg[@"messageId"] = kFirebaseServerValueTimestamp; 

注意,有一個火力地堡一個可能的錯誤:你從FEventTypeChildAdded收到時間戳的人似乎有時與Firebase DB中保存的不同(幾百毫秒差異)。

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) 

希望這可以幫助別人

相關問題