生产数据库上的数据未更新

时间:2017-12-08 00:39:19

标签: swift firebase firebase-realtime-database

我的项目有一个奇怪的情况。我有2个实体:儿童和用户。用户创建孩子,所以对于孩子,我有他们的所有者和用户的参考我有他们创建的孩子的列表。

当我向firebase添加一个新子项时,该子项的用户所有者已更新其子项列表以添加该新子项。

事情是:在暂存环境中,一切都按预期工作。但是在生产环境中,子项将添加到子项中,但不会添加到用户的子项列表中。

两个数据库都有相同的规则。

我已经部分开发了这个项目,所以我甚至无法找到用户应该更新的具体位置。在我看来,当你更新一个孩子时,用户实体会自动更新(使用断点我可以验证它实际上是在同一步骤中发生的)。我是Firebase的新手,所以我真的迷失在这里。

有人可以帮我吗?

以下是数据库规则:

{"rules": {
"children": {
  "$uid": {
    ".validate": "newData.hasChildren(['first_name'])",
    "date_of_birth": {
      ".validate": "newData.isString() && newData.val().matches(/^(19|20)\\d\\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/)"
    },
    "first_name": {
      ".validate": "newData.isString() && newData.val().length > 0"
    },
    "users": {
      "$key2": {
        ".validate": "root.child('users').child($key2).val() != null && newData.isString() && newData.val() == 'parent'"
      },
      ".validate": "newData.hasChildren()"
    },
    "$other": {
      ".validate": "false"
    },
    ".read": "data.child('users').child(auth.uid).val() != null",
    ".write": "data.child('users').child(auth.uid).val() == 'parent' || newData.child('users').child(auth.uid).val() == 'parent'"
  }
},
"users": {
  ".indexOn": [
    "email"
  ],
  "$uid": {
    ".validate": "newData.hasChildren()",
    "email": {
      ".validate": "newData.isString() && newData.val() == auth.token.email"
    },
    "first_name": {
      ".validate": "newData.isString()"
    },
    "is_subscribed": {
      ".validate": "newData.isBoolean()"
    },
    "children": {
      "$key5": {
        ".validate": "root.child('children').child($key5).val() != null && newData.isString() && newData.val() == 'parent'"
      },
      ".validate": "newData.hasChildren()"
    },
    "$other": {
      ".validate": "false"
    },
    ".read": "auth != null && auth.uid == $uid",
    ".write": "auth != null && auth.uid == $uid"
  }
}

} }

以及为其添加子项的代码。

var entityDatabase: DatabaseReference = Database.database().reference().child(“children”).child(did)
entityDatabase.keepSynced(true)

var firstName: String?
var users: [String: String] = [:]



var params: [String: Any] {

    var strings: [String: String] = [:]

    strings["first_name"] = firstName

    let keysToRemove = strings.keys.filter { strings[$0] == "" }

    for key in keysToRemove {
        strings.removeValue(forKey: key)
    }

    var dict: [String: Any] = strings
    dict["users"] = users

    return dict
}

guard let user = Firebase.Auth.auth().currentUser else {
        return
    }

    guard firstName?.isEmpty == false else {
        return
    }

    users[user.uid] = "parent"

    entityDatabase.updateChildValues(params) { [weak self] (error, _) in
        self?.observe()

        guard error == nil else {
            return
        }

        switch self?.updatedImage {
        case let image?:
            self?.save(image: image, completion: completion)
        case nil:
        }
    }

0 个答案:

没有答案