2017-07-07 39 views
1

我正在swift中开发一个项目,并将Firebase作为后端来管理数据。Firebase:如何在现有表格中添加新属性

FirebaseApp.configure() 
Database.database().isPersistenceEnabled = true 

这是我在应用程序委托文件中设置的内容。现在在我的聊天模块中,我通过以下代码在Firebase数据库中添加了消息信息。

let messageData = ["text": text, "senderId": senderId, "senderName": senderDisplayName, "MediaType": "TEXT"] 
    self.messageSentRef?.child("Messages").childByAutoId().setValue(messageData) 

现在我想在消息表中添加一个名为TimeStamp的新属性。

任何人都可以帮助我如何做到这一点?

+0

是否要更新现有的节点?或只是在新的? –

+0

Firebase中没有表格,只有节点(父节点和子节点)。如果你想写一个新的节点,它会是childNode.setValue(“timestamp”)。 childNode将在代码中定义为parentNode.child(“child_node”),或者在您的情况下为messagesSentRef.child(“Messages”)。childByAutoId()。setValue(“timestamp”) – Jay

回答

1

如果您有MessageItem/MessageData对象,则可以通过修改对象结构来始终为其添加更多属性。为了增加timestamp到现有的数据,你可以在你的火力地堡/数据库主机直接添加它(这是一个手动的方式来做到这一点,或者只是做在像这样的代码)

let messageItem = MessageItem(text: text, 
          senderId: self.user.email, 
          senderDisplayName: false, 
          mediaType: "", 
          timestamp: "") 

let messageItemRef = self.ref.child("Message") 
messageItemRef.setValue(messageItem.toAnyObject()) 

编辑: 原来的问题没有一个MessageItem对象,以便让我们把一个在一起,使这个答案的工作:

在你的viewController类(或任何顶级类),我们需要实现一个MessageItem类对象这样

class MessageItem { 
    var text = "" 
    var senderId = "" 
    var senderDisplayName = false 
    var mediaType = "" 
    var timestamp = "" 

    init(text: String, senderId: String, senderDisplayName: Bool, mediaType: String, timestamp: String) { 
     self.text = text 
     self.senderId = senderId 
     self.senderDisplayName = senderDisplayName 
     self.mediaType = mediaType 
     self.timestamp = timestamp 
    } 

    func toAnyObject() -> Any { 
     return [ 
      "text": text, 
      "senderId": senderId, 
      "senderDisplayName": senderDisplayName, 
      "mediaType": mediaType, 
      "timestamp": timestamp 
     ] 
    } 
} 
+0

这是一个很好的答案,但假设OP使用一个类对象。我将这一功能添加到您的答案中以获得完整性。 – Jay

+0

感谢您的补充,答案更清晰。 – Lawliet

0

在Firebase中,数据可以用键值对的字典来表示。键值总是一个字符串,但值可以是多种不同的东西,一个字符串,Int等。

该值也可以是另一个键:值对的字典。

在你的情况,这行代码生成一个密钥:值对一个字符串的:和另一个字符串(messsageData)

self.messageSentRef .child( “消息”)childByAutoId()?。的setValue(messageData)

如果你想也有一个时间戳孩子看起来不是写一个字符串这样

app_node 
    Messages 
     -y88hj3-39i9isdf: "some message data" 

,你可以写键的整个词典:值对 - 这样

let messageDictionary = [ 
    "text": "some text", 
    "senderId": "the sender Id", 
    "senderDisplayName": "the sender display name", 
    "mediaType": "a media type", 
    "timestamp": "170708" 
] 

let messageItemRef = self.ref.child("Messages") 
messageItemRef.childByAutoId().setValue(messageDictionary) 

它创建以下节点:

app_node 
    Messages 
     -Y9js9s9m494jms: 
      text: "some text" 
      senderId: "the sender Id" 
      senderDisplayName: "the sender display name" 
      mediaType: "a media type" 
      timestamp: :170708" 
相关问题