Firebase有时无法将数据保存到数据库中?

时间:2019-04-16 09:18:44

标签: ios swift firebase firebase-realtime-database

我有一个代码可以将多个内容保存到数据库中(照片ID,用户ID,用户名,密钥)

问题是,当我单击按钮保存该数据时,Firebase有时无法保存所有数据(有时无法一次保存照片ID,用户名或键或多项)

有时会成功,并将它们全部保存到数据库中

有什么问题,我该如何解决?

ref.child("requests").child("receiver").child((event?.userID)!).child("event").child(event!.key).child("requester").child(user!.uid).child("isRequesterAccepted").setValue(false)
                ref.child("requests").child("receiver").child((event?.userID)!).child("event").child(event!.key).child("requester")
                .child(user!.uid).child("name").setValue(name)
                ref.child("requests").child("receiver").child((event?.userID)!).child("event").child(event!.key).child("requester")
                .child(user!.uid).child("key").setValue(String(user!.uid))
                ref.child("requests").child("receiver").child((event?.userID)!).child("event").child(event!.key).child("requester")
                .child(user!.uid).child("profile_picture").setValue(String(user!.uid))
                ref.child("requests").child("receiver").child((event?.userID)!).child("event").child(event!.key).child("requester")
                .child(user!.uid).child("eventKey").setValue(event?.key)

2 个答案:

答案 0 :(得分:0)

我不确定100%,但是可能的原因是在代码中使用了强制展开。

因此,请尝试重构一点:

guard let indeedEvent = event,
  let indeedUser = user else {
  return
}

ref.child("requests")
  .child("receiver")
  .child(indeedEvent.userID)
  .child("event")
  .child(indeedEvent.key)
  .child("requester")
  .child(indeedUser.uid)
  .child("isRequesterAccepted")
  .setValue(false)

ref.child("requests")
  .child("receiver")
  .child(indeedEvent.userID)
  .child("event")
  .child(indeedEvent.key)
  .child("requester")
  .child(indeedUser.uid)
  .child("name")
  .setValue(name)

ref.child("requests")
  .child("receiver")
  .child(indeedEvent.userID)
  .child("event")
  .child(indeedEvent.key)
  .child("requester")
  .child(indeedUser.uid)
  .child("key")
  .setValue(String(indeedUser.uid))

ref.child("requests")
  .child("receiver")
  .child(indeedEvent.userID)
  .child("event")
  .child(indeedEvent.key)
  .child("requester")
  .child(indeedUser.uid)
  .child("profile_picture")
  .setValue(String(indeedUser.uid))

ref.child("requests")
  .child("receiver")
  .child(indeedEvent.userID)
  .child("event")
  .child(indeedEvent.key)
  .child("requester")
  .child(indeedUser.uid)
  .child("eventKey")
  .setValue(indeedEvent.key)

答案 1 :(得分:0)

我不确定这是否是“正确”的答案,但也许会引导您找到答案。

几件事:

您可以将此代码大大简化

let ref = rootRef.child("requests").child("receiver").child((event?.userID)!).child("event").child(event!.key).child("requester").child(user!.uid)
let data = [
    "isRequesterAccepted": false,
    "key": String(user!.uid),
    "profile_picture": String(user!.uid),
    "eventKey": event?.key
]
ref.setValue(data)

而且,如前所述,您不能安全地解开可选项,因此可能是数据无效或不是预期的结果。

例如,这很危险

(event?.userID)!

事件可能为零,这将导致应用崩溃。

另外,这可能是个问题,您在这里表示,该事件肯定不是零。

event!.key

我还注意到您在两个节点中存储了相同的值-这可能是个问题

.child("key").setValue(String(user!.uid))
.child("profile_picture").setValue(String(user!.uid))