如何在java中向firebase数据库中的数组添加多个项?

f1tvaqid  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(380)

在我的androidstudiojava项目中,在firebase实时数据库中,我正在为登录的用户设置最喜欢的食物。每次我使用setvalue时,它都会覆盖现有的条目。我想添加多种食物,如在一个数组。
下面是更新firebase实时数据库的代码

FirebaseAuth.getInstance().getCurrentUser();
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    FirebaseDatabase database =  FirebaseDatabase.getInstance();

    String userId = user.getUid();
    User user1 = new User("banana");
    DatabaseReference mRef =  database.getReference().child("Users").child(userId);
    mRef.setValue(user1);

下面是user java类

public class User {

    public String foods;

    //required default constructor
    public User() {
    }

    public User(String foods) {
        this.foods = foods;
    }

    public String getFoods() {
        return foods;
    }

    public void setFoods(String foods) {
        this.foods = foods;
    }
}

在firebase中,这是我的json响应示例:

{
  "Users" : {
    "ExampleUser1" : {
      "foods" : "banana"
    }
  }
}

更换

mRef.setValue(user1);

具有

mRef.push().setValue(user1);

似乎把我带到了我要去的地方。

{
  "Users" : {
    "ExampleUser1" : {
      "-MZ4Cfec_EFb6i5bUIEl" : {
        "foods" : "banana"
      },
      "-MZ4EJV14CKUvYn9ISJl" : {
        "foods" : "apple"
      }
    }
  }
}

编辑:这是我最终使用的解决方案。谢谢大家的帮助和评论。
在firebase实时数据库中,数组不是以数组的形式存储的,使用firebase实时数据库处理数组有点棘手,它们不能按预期工作。firebase将它们存储为键值对。为了得到想要的结果,我使用了一个哈希Map,在这里我可以设置键和值对。这是唯一需要的代码,我删除了用户类。字符串fruit就是一个例子,每次更新时,它都会被添加到该用户的数据库中。不允许重复条目,因为我将水果的值也设置为等于键。

String fruit="banana"
    FirebaseAuth.getInstance().getCurrentUser();
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    FirebaseDatabase database =  FirebaseDatabase.getInstance();

    String userId = user.getUid();
    DatabaseReference mRef =  database.getReference().child("Users").child(userId);

    Map<String, Object> updates = new HashMap<String,Object>();

    updates.put(fruit, fruit);

    mRef.updateChildren(updates);

以下是firebase实时数据库的json响应:

{
  "Users" : {
    "UserExample1" : {
      "banana" : "banana",
      "apple" : "apple",
      "orange" : "orange"
    }
  }
}
sqserrrh

sqserrrh1#

试试update(),看看是否有效

ibrsph3r

ibrsph3r2#

如果你想储存一系列的食物,你应该先将其模型化到你的``中。

public class User {

    public String[] foods;

    //required default constructor
    public User() {
    }

    public User(String[] foods) {
        this.foods = foods;
    }

    public String[] getFoods() {
        return foods;
    }

    public void setFoods(String[] foods) {
        this.foods = foods;
    }
}

然后,您只需将该数组设置为数据库:

String userId = user.getUid();
User user1 = new User(new String[] {"banana", "apple"});
DatabaseReference mRef = database.getReference().child("Users").child(userId);
mRef.setValue(user1);

我还建议您阅读以下内容,因为数组是firebase中常见的反模式:
最佳实践:firebase中的阵列。
如果child的子级包含值,则执行firebase查询

ds97pgxw

ds97pgxw3#

在firebase实时数据库中,数组不是以数组的形式存储的,使用firebase实时数据库处理数组有点棘手,它们不能按预期工作。firebase将它们存储为键值对。为了得到想要的结果,我使用了一个哈希Map,在这里我可以设置键和值对。这是唯一需要的代码,我删除了用户类。字符串fruit就是一个例子,每次更新时,它都会被添加到该用户的数据库中。不允许重复条目,因为我将水果的值也设置为等于键。

String fruit="banana"
    FirebaseAuth.getInstance().getCurrentUser();
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    FirebaseDatabase database =  FirebaseDatabase.getInstance();

    String userId = user.getUid();
    DatabaseReference mRef =  database.getReference().child("Users").child(userId);

    Map<String, Object> updates = new HashMap<String,Object>();

    updates.put(fruit, fruit);

    mRef.updateChildren(updates);

以下是firebase实时数据库的json响应:

{
  "Users" : {
    "UserExample1" : {
      "banana" : "banana",
      "apple" : "apple",
      "orange" : "orange"
    }
  }
}

相关问题