将字典存储到 Firebase 中?

Posted

技术标签:

【中文标题】将字典存储到 Firebase 中?【英文标题】:Storing dictionaries into Firebase? 【发布时间】:2015-05-13 18:18:06 【问题描述】:

我有一个 Firebase 实例,我想在其中存储要存储到 firebase 中的值字典。我查看了文档https://www.firebase.com/docs/ios/guide/saving-data.html 作为参考,但似乎无法让它工作。以下是我的尝试:

    //Declared above are the currentUser values as so:
    var currentUserFirstName: String!
    var currentUserLastName: String!
    var currentUserObjectID: String!

    var attendeesArray = ["objectID": currentUserObjectID, "name": currentUserFirstName + " " + currentUserLastName]
    var eventRefChild = EventReference.childByAutoId()
    eventRefChild.setValue([
        "eventName":eventName.text,
        "attendees": attendeesArray,
        "eventCreator": currentUserFirstName 
        ])

但是当我尝试执行 eventRefChild.setValue([... 时,我一直收到错误消息:Could not find an overload for '+' that accepts the supplied arguments,老实说,我不太清楚为什么会遇到这个问题。任何帮助将不胜感激!

编辑:变量EventReference 分配如下:EventReference = Firebase(url:"<Insert Firebase URL>")

currentUserFirstNamecurrentUserLastName 内部是从Facebook 获取的个人的名字和姓氏,因此它看起来分别类似于Bob Smith

【问题讨论】:

这样做让 name = currentUserFirstName + " " + currentUserLastName。然后使用名称常量。 我不知道你为什么关闭了关于完全相同问题的上一个问题,但我的评论保持不变:此代码中唯一的 + 运算符是你连接 currentUserFirstName + " " + currentUserLastName 的地方。如果您单步执行代码,该行是否正确执行? 你能提供更多的代码吗?查看 currentUserFirst 和 currentUserLast 的值会很有用。 Firebase 将接受 setValue 的字典,因此那里不应该有问题。另外我不确定 EventReference 是什么。如果您能提供更多有关这方面的信息,那将会很有帮助。 @FrankvanPuffelen 当我们单步执行代码时,该行正确执行。我已将那部分代码正确存储到我的数据库中。 如果你只是硬编码值会发生什么:Firebase(url:"<Insert Firebase URL>").childByAutoId().setValue([ "eventName":"Google I/O", "attendees": ["objectID": "209103", "name": "Frank van Puffelen"]]) 【参考方案1】:

您的代码没有问题。问题是正在加载的值

var currentUserFirstName: String!
var currentUserLastName: String!

作为测试,我使用以下代码创建了一个示例项目,这是您发布的代码的副本,但在 var 中加载了普通字符串:

    var myRootRef = Firebase(url:"https://myproject.firebaseIO.com/")

    var currentUserFirstName = "Test"
    var currentUserLastName = "User"
    var currentUserObjectID = "object ID"

    var attendeesArray = ["objectID": currentUserObjectID, "name": currentUserFirstName + " " + currentUserLastName]
    var eventRefChild = myRootRef.childByAutoId()
    eventRefChild.setValue([
        "eventName": "eventName",
        "attendees": attendeesArray
        ])

项目已正确编译并运行,预期数据已写入 Firebase。请注意,eventName.text 也被替换为字符串,但这不会影响答案。

调查需要转向 var 中加载的内容,答案是这些 var 中的一个 currentUserFirstName 或 currentUserLastName 正在加载 OBJECT(类),而不是字符串。

附带说明一下,为什么将 var 声明为隐式展开的可选项(!)

编辑:添加额外的信息来处理选项

if let actualString = currentUserFirstName 
    println(actualString) //proceed working with the the optional string

else 
    return // something bad happened! currentUserFirstName does not contain a string

为防止在可选项不包含值时代码出错,请将上述代码直接添加到代码串联行的上方。这里发生的是我们将 currentUserFirstName(可选 var)中的字符串分配给实际字符串(标准的非可选 var)。

如果表达式的计算结果为真,那么我们可以继续计算 currentUserFirstName。

如果为 false,则 currentUserFirstName 不包含字符串,因此请优雅地处理错误。

【讨论】:

我正在使用声明为未包装选项的变量,因为我正在使用这些值并在 segues 之间传递它们。我会尝试解决这个问题并让你知道。 更新:我尝试的是像这样声明变量:var currentUserFirstName: Stringvar currentUserLastName: Stringvar currentUserObjectID: String 但我收到一条错误消息'_' not convertible to 'StringLiteralConvertible' 看来你是对的。将变量声明为 String 类型会影响我将值存储到 Firebase 中的能力。无论如何围绕这个?我仍然想在 segue 之间传递这些值并将它们存储到我的 Firebase 参考中。 我不认为将 var 声明为 String 是问题所在。当您将其声明为隐式展开的可选(字符串!)时,不能保证 var 包含对字符串的引用,并且在这些情况下会生成运行时错误。我的猜测是 var 被覆盖、设置为 nil 或在代码的其他地方变得未定义。您可能应该在连接它们之前评估这两个字符串。 嗯,但即使我将 var 声明为可选(作为字符串?)或没有可选或隐式展开它(作为字符串),我仍然遇到与我在上面发布的相同的问题 @ 987654329@。我已经仔细检查了变量是否被覆盖,设置为 nil,并且我确保它们被设置为应有的状态。我尝试将 currentUserFirstName 设置为 Firebase 作为另一个属性,这对我有用。

以上是关于将字典存储到 Firebase 中?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase - 显示到 ListView

将图像存储在 Firebase Storage 中并将元数据保存在 Firebase Cloud Firestore(测试版)中

将Firebase存储与Google云CDN集成

使用Javascript上传Firebase文件

每次调用 Firebase Analytic 的 getInstance() 与将实例存储为 Application 类中的静态变量

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba