【问题标题】:Firebase overwrites existing records instead of appending themFirebase 覆盖现有记录而不是附加它们
【发布时间】:2017-04-23 11:08:15
【问题描述】:

我对 Firebase 有点陌生,因此一直在尝试帮助自己更加熟悉它。因此,当我在玩实时数据库时,我试图将数据附加到 JSON 树。代码如下

mSaudi.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            count++;
            mHistory = mChildRef.child(Integer.toString(count));
            current = riyadh;
            mChildRef.setValue(riyadh);
            mHistory.push().setValue("riyadh");
        }
    });

我需要的树是这样的:

value:   
 1: some text   
 2: some other text

但实际发生的是这样的:

value:
   1: some text

正在更新中

value:
   2:some text

上一个条目被删除

我尝试以各种方式更改引用,但无济于事。在这方面的任何帮助将不胜感激。

【问题讨论】:

  • @downvoters 请解释一下。

标签: android json firebase firebase-realtime-database


【解决方案1】:

如果您想保存这两个值,则必须使用变量(例如 Hashmap)来保存它们。如果您保存一个字符串,然后尝试在同一分支下保存另一个字符串,它将删除以前保存的所有内容。所以试试下面的

HashMap<String, String> map = new HashMap<>();
map.put("1","String");
map.put("2","String");
mHistory.push().setValue(map);

这将保存两个字符串而不删除一个。

如果你只想添加一个字符串

mHistory.push().child("1").setValue("Your first String");

不过,最大的问题是每次使用 push() 时都会生成一个随机密钥,因此您必须将密钥保存为字符串并将其用作孩子的参考。

【讨论】:

  • 这可行,但是否可以只使用 Firebase 添加新元素,而不是每次必须进行更改时都必须将整个 HashMap 作为新条目推送到数据库?
  • @PrejithP 是的,这是可能的。接受的答案显示了如何单独做值
【解决方案2】:

当您在 Firebase 上设置值时,它将替换引用中的所有内容。

假设您有一个房屋价值,有 2 个孩子:ColorSize

如果您只想编辑颜色值,在 setValue() 之前,您将不得不更改您推送到的参考。

如果您的参考是getReference().child("houses") 并且您将某些东西推到那里,它将替换那里和它下面的所有内容。这样做的方法是创建一个新的引用(或更新预览),如下所示:getReference().child("houses").child(houseKey).child("color") 并将您的字符串推到那里。

在您的示例中,您需要在 push() 方法之前添加要更改为子项的字段。

@Janwilx72 已经告知了另一种方法,即获取整个对象,在本地更新值并再次推送整个对象。

【讨论】:

  • 获取整个对象,在本地更新值并再次推送整个对象。并发请求呢?
【解决方案3】:

你可以试试这个

mChildRef.child("2").setValue("some text");

应该是追加新项目而不是覆盖它们

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 2014-03-07
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多