当前位置: 首页 > 知识库问答 >
问题:

无重复更新firebase

商曦
2023-03-14
myApp--> news 

          --> K8ZqRIzrX6L3q-HjO8V --> title : "value title1"
                                  --> body : "value body1"
                                  --> ....

          --> K8ZqRJ1tI7onmoVX8G4 --> title : "value title2"
                                  --> body : "value body2"
                                  --> ....
 [{title: "value title2", body: "value body2", ...},{title: "value title3", body: "value body3", ...}]

编辑:我使用了MyFireBaseRef.push(),示例代码如下所示,

                objNews.forEach(function(news){
                    myFirebaseRef.push(news,function(){
                    $('.result').append('<li><strong>' + news.title + '</strong></li>');
                    });   
                }); 

其中objNews有新的数据以及firebase已经有的数据。我想要实现的是只从ObjNews中推送新的数据,避免firebase已经有的数据。但是我的代码将Object中的所有数据推到firebase,结果是重复的。

共有1个答案

郦何平
2023-03-14

如果我理解正确的话,您有一个包含新闻文章的JavaScript数组:

[
  {title: "value title2", body: "value body2", ...},
  {title: "value title3", body: "value body3", ...}
]

您希望将该数组发送到Firebase,然后能够更新数组中的值,并将更新发送到Firebase。

这是一个反模式,不要这样做!

var keysByIndex = {};
objNews.forEach(function(news, index){
    var newRef = myFirebaseRef.push(news);
    keysByIndex[index] = newRef.key();
});
var keysByIndex = {};
objNews.forEach(function(news, index){
    if (keysByIndex[index]) {
        var newRef = myFirebaseRef.push(news);
        keysByIndex[index] = newRef.key();
    }
    else {
        myFirebaseRef.child(keysByIndex[index]).update(news);
    }
});

它是这样工作的:

your app                        Firebase
                                  +-+
 -------- send write command -->  | |
 +-+                              | |
 |s|                              |s|
 |t|                              |t|
 |a|                              |a|
 |t|  <-- listen for changes ---  |t|
 |e|                              |e|
 +-+                              | |
                                  +-+

在这个场景中,本地应用程序状态(在您的场景中为objnews)来自对Firebase的监听。所有更改都写入Firebase,而不是写入本地数组。

一个关于如何使用它的小片段。我将只创建/更新DOM元素,因为这也是您的代码所做的:

myFirebaseRef.on('child_added', function(snapshot) {
  // a news article was added, add it to the HTML
  var key = snapshot.key();
  var news = snapshot.val();
  $('.result').append('<li id="'+key+'"><strong>' + news.title + '</strong></li>');
})
myFirebaseRef.on('child_changed', function(snapshot) {
  // a news article was changed, update the HTML for it 
  var key = snapshot.key();
  var news = snapshot.val();
  $('#'+key).html('<li id="'+key+'"><strong>' + news.title + '</strong></li>');
})
myFirebaseRef.on('child_removed', function(snapshot) {
  // a news article was remove, remove the HTML for it 
  var key = snapshot.key();
  var element = document.getElementById(key);
  element.parentNode.removeChild(element);
})
 类似资料:
  • 我遇到了非常奇怪的情况。我成功地将Android SDK工具更新到版本22.6.1。现在当我启动ADT(Eclipse)时,它会向我显示一条消息,上面写着以下内容。 当我按下“检查更新”按钮时,Eclipse会显示一条消息,上面写着“未找到更新”消息。如果我通过帮助-检查更新执行此操作,结果相同。 如果我打开Help-Install New Software并选择Developer Tools U

  • 我有一张非常复杂的表格,是这样的:- 现在,我需要处理一个应该重复一行的查询,其中假设p2、p3或p1、p2甚至仅p2值对于该特定年份或从2009年、2010年或2011年中的任何一年都不可用,并将最后一列的值作为零放入其中。 所以现在我的数据库看起来应该像- 我试着使用临时表 但它不起作用。有谁能帮我。

  • 问题内容: 这个问题已经在这里有了答案 : 如何将mysql更改为mysqli? (11个答案) 3年前关闭。 因此,由于不推荐使用MYSQL,并且eveyone不断告诉我进行更新,所以我认为这是我做的时间。 但是由于我不习惯mysqli_ *,对我来说似乎有些陌生。当我用Mysql编码整个网站时,这不是一个简单的编辑。 所以我想知道:如何将以下代码转换为Mysqli?只是为了给我和其他任何人一个

  • 问题内容: MySQL有这样的东西: 据我所知,SQLite中不存在此功能,我想知道的是,是否有任何方法可以实现相同的效果而不必执行两个查询。另外,如果这不可能,那么您更喜欢什么: SELECT +(插入或更新) 或 UPDATE( 如果UPDATE失败,则 + INSERT ) 问题答案: 由于3.24.0 SQLite还支持upsert ,因此现在您可以简单地编写以下内容

  • 我正在从一个文件导出常量并将其导入另一个文件,如下所示: 常数.js App.js 我希望我的初始状态是在构造函数中设置的,然后在componentWillMount上,我希望使用常量文件中的值设置状态,然后再围绕组件和流添加进一步的逻辑。 但是,我发现,我的状态没有被更新,如果我在调用setState之后记录控制台日志,状态仍然没有定义,如果我引入一个方法,需要state中的值,那么在执行堆栈的

  • 我试图在if语句中设置状态,但它不会这样做。结果,我需要从if语句中更新状态,在那个里我可以接收经度和纬度坐标,但它不会保存状态。若我在If语句之外的控制台中回显,我将只读取第一个setState值表单componentWillMount。有什么问题吗?我做错了什么?结构如下: