【问题标题】:How to perform a multi-path data update on Firebase when data is changed from the Firebase Console?从 Firebase 控制台更改数据时,如何在 Firebase 上执行多路径数据更新?
【发布时间】:2017-12-22 10:20:32
【问题描述】:

我目前正在开发一个 iOS 应用,我正在使用 Firebase 为其提供动力。

由于我的应用程序仍然相对较小,我经常使用数据库对数据进行手动修改。我的用户可以提交地点(我在地图上显示),然后我手动查看条目以确保数据完整且正确。

我最近开始使用 GeoFire,因此不得不为每个地点的坐标(纬度和经度)开始非规范化我的数据

因此,我的数据库中有 2 个位置的坐标

  1. /places/place_key/...
  2. /geofire/place_key/下...

我目前正在寻找一种方法来自动更新我的数据库的 /geofire 端当我更新 /places 端的某个地方的纬度或经度直接从 Firebase 控制台

我正在寻找有关如何做到这一点的提示。 Firebase Functions 可以帮助我吗?

干杯,

埃德

【问题讨论】:

  • 是的,通过写入事件云函数可以为您做到这一点。您告诉我您手动查看以确保数据完整且正确。您应该添加 firebase 实时数据库规则以检查数据是否完整且格式正确。
  • 嘿@J。谢谢你的评论。我现在需要手动验证数据的原因是因为我的用户不需要给我他们添加的位置的确切位置,所以有时我没有坐标,必须自己找到它们并将它们添加到数据库中手动。因此,为什么我只需要更新它们一次而不是几次,因为我的数据库是非规范化的。

标签: ios swift firebase firebase-realtime-database denormalization


【解决方案1】:

如果将来有人碰巧寻找这个问题的答案,我关注了@J。美国能源部建议并使用Firebase Cloud Functions

设置超级简单,步骤here

这是示例代码,当我的一个对象更新时,我可以更新数据库的多个端点。

const functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);


exports.placeDataUpdated = functions.database.ref('/places/{placeId}').onUpdate(event => {

    const place = event.data.val();
    const key = event.params.placeId;

    console.log("Updated place data for key: ", key);

    var dataToUpdate = {};

    dataToUpdate["places_summary/"+key+"/city"] = place.city;
    dataToUpdate["places_summary/"+key+"/country"] = place.country;
    dataToUpdate["places_summary/"+key+"/latitude"] = place.latitude;
    dataToUpdate["places_summary/"+key+"/longitude"] = place.longitude;
    dataToUpdate["places_summary/"+key+"/name"] = place.name;
    dataToUpdate["places_summary/"+key+"/numReviews"] = place.numReviews;
    dataToUpdate["places_summary/"+key+"/placeScore"] = place.placeScore;
    dataToUpdate["places_summary/"+key+"/products"] = place.products;
    dataToUpdate["places_summary/"+key+"/visible"] = place.onMap;
    dataToUpdate["places_GeoFire/"+key+"/l/0"] = place.latitude;
    dataToUpdate["places_GeoFire/"+key+"/l/1"] = place.longitude;

    return event.data.ref.parent.parent.update(dataToUpdate);

});

超级方便,几乎没有时间设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 2020-04-15
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多