将字典存储到 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>")
在currentUserFirstName
和currentUserLastName
内部是从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: String
、var currentUserLastName: String
、var currentUserObjectID: String
但我收到一条错误消息'_' not convertible to 'StringLiteralConvertible'
看来你是对的。将变量声明为 String
类型会影响我将值存储到 Firebase 中的能力。无论如何围绕这个?我仍然想在 segue 之间传递这些值并将它们存储到我的 Firebase 参考中。
我不认为将 var 声明为 String 是问题所在。当您将其声明为隐式展开的可选(字符串!)时,不能保证 var 包含对字符串的引用,并且在这些情况下会生成运行时错误。我的猜测是 var 被覆盖、设置为 nil 或在代码的其他地方变得未定义。您可能应该在连接它们之前评估这两个字符串。
嗯,但即使我将 var 声明为可选(作为字符串?)或没有可选或隐式展开它(作为字符串),我仍然遇到与我在上面发布的相同的问题 @ 987654329@。我已经仔细检查了变量是否被覆盖,设置为 nil,并且我确保它们被设置为应有的状态。我尝试将 currentUserFirstName
设置为 Firebase 作为另一个属性,这对我有用。以上是关于将字典存储到 Firebase 中?的主要内容,如果未能解决你的问题,请参考以下文章
将图像存储在 Firebase Storage 中并将元数据保存在 Firebase Cloud Firestore(测试版)中
每次调用 Firebase Analytic 的 getInstance() 与将实例存储为 Application 类中的静态变量
Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba