Firebase数据库规则 - 如何不覆盖现有数据

时间:2018-04-16 17:45:18

标签: javascript firebase firebase-realtime-database

我在Firebase数据库中编写“WRITE”规则时遇到问题。我有一个节点“drink_database”,在其中,我有一个这些饮料的条形码列表。这可以从代码

中看出
$ pm list permissions -g | grep 'permission:' | wc -l
509

现在,该应用的用户将能够将饮料上传到数据库,但是,如果该饮料的条形码在数据库中不存在。因此,从上面的示例中,如果用户的饮料具有条形码“8888”并且用户尝试将其上传到Firebase,我不希望用用户的数据覆盖此数据。此外,我希望只有经过身份验证的用户才能写入数据。有人可以帮助规则吗?

{
  "drink_database": {
    "8888": {
      "barcode": "8888",
      "drink_volume": "1234",
      "image": "https://firebasestorage.googleapis.com/v0/b/popbar-664cd.appspot.com/o/drinks_images%2F8888?alt=media&token=72886b8c-f0fb-4729-a125-848ad2a48321",
      "name": "sjsnj"
    },
    "1234568": {
      "barcode": "1234568",
      "drink_volume": "7879",
      "image": "https://firebasestorage.googleapis.com/v0/b/popbar-664cd.appspot.com/o/drinks_images%2F1234568?alt=media&token=2d6dcc56-7a29-4551-8c32-c9b2765c436d",
      "name": "vodka"
    }
  }
}

1 个答案:

答案 0 :(得分:2)

在只有经过身份验证的用户可以创建(而不是更新或删除)数据的情况下,规则很简单:

".write": "auth != null && (!data.exists() || !newData.exists())"

有关更多信息和示例,建议您花一些时间阅读the firebase docs

如果您还希望能够删除数据,可以将写入规则更改为:

var tableView = UITableView()
    var twoDimensionalArray = [
        cameraInfoStruct(cameraInfo: ["Camera Body","Lens", "FPS", "Shutter Angle", "Colour Temperature", "Resolution Width", "Resolution Height", "Format", "Camera Rig"]),
        cameraInfoStruct(cameraInfo:["Focus Length", "F - Stop", "Camera Height", "Camera Tilt", "Camera Roll", "Filter"])
    ]

    let cellId = "cellId"
    let screenHeight = UIScreen.main.bounds.height
    let screenWidth = UIScreen.main.bounds.width
    let sectionHeaders = ["General", "Advanced"]

    override func viewDidLoad() {
        super.viewDidLoad()

        addTableView()
    }

    func addTableView() {
        tableView = UITableView(frame: CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight))
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
        tableView.dataSource = self
        tableView.delegate = self
        tableView.tableFooterView = UIView()
        self.view.addSubview(tableView)
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

        if let sectionHeaderArray = sectionHeaders as? [String] {
            return sectionHeaderArray[section]
        }
        return "unknown"
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return twoDimensionalArray[section].cameraInfo.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return sectionHeaders.count
    }

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cell.backgroundColor = UIColor.white
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! cameraInfoCell
        let shotNumber = twoDimensionalArray[indexPath.section].cameraInfo[indexPath.row]

        cell.textLabel?.text = shotNumber

        return cell
    }
}