将项添加到Firebase数据库的列表中

Yun*_*Han 15 android firebase firebase-realtime-database

我有以下Firebase数据库结构.uIds是一种类型List<String>.我正在尝试uIds使用递增的索引添加另一个uId .setValue()updateChildren()要求我检索现有数据,push()并将添加一个项目,其中随机生成的字符串作为键而不是递增的索引.是否有一种更简单的方法不需要检索现有数据?谢谢!

  "requests" : {
    "request001" : {
      "interests" : [ "x" ],
      "live" : true,
      "uIds" : [ "user1" ]  // <---- from this
    },
    "request002" : {
      "interests" : [ "y" ],
      "live" : true,
      "uIds" : [ "user2" ]
    }
  }
Run Code Online (Sandbox Code Playgroud)

--------------------------------

编辑:

对不起,对不起.让我详细说明一下.假设我有上述数据库,并希望将其更新为以下内容.

  "requests" : {
    "-KSVYZwUQPfyosiyRVdr" : {
      "interests" : [ "x" ],
      "live" : true,
      "uIds" : [ "user1", "user2" ]   // <--- to this
    },
    "-KSl1L60g0tW5voyv0VU" : {
      "interests" : [ "y" ],
      "live" : true,
      "uIds" : [ "user2" ]
    }
  }
Run Code Online (Sandbox Code Playgroud)

ishmaelMakitla的建议,mDatabase.child("requests").child("request001").setValue(newRequest)将用"newRequest"覆盖"request001".所以我应该检索"request001"的现有数据并将"user2"添加到列表中uIds.它将是这样的:

mDatabase.child("requests").child("request001").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Request newRequest = dataSnapshot.getValue(Request.class);
        newRequest.uIds.add("user2");
        mDatabase.child("requests").child("request001").setValue(newRequest);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}

});
Run Code Online (Sandbox Code Playgroud)

但我想知道这个过程是否必要,因为我想要做的只是将一个项目添加到列表中uIds.

Fra*_*len 17

有关创建可扩展数据Firebase文档建议您使用不同的数据结构:

"requests" : {
  "-KSVYZwUQPfyosiyRVdr" : {
    "interests" : { "x": true },
    "live" : true,
    "uIds" : { 
      "user1": true, 
      "user2": true 
    }
  },
  "-KSl1L60g0tW5voyv0VU" : {
    "interests" : { "y": true },
    "live" : true,
    "uIds" : { 
      "user2": true 
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是此数据结构更好地工作的一些原因:

  • 每个uid现在只能自动出现一次.我们基本上将数据建模为一,而不是使用数组.
  • 添加项目现在就像 ref.child("uUids").child("user3").setValue(true)
  • 您现在可以检查安全规则中是否存在uid.

我已经开始重新迭代到自己:每当你发现自己在做的时候array.contains("xyz"),你应该使用一个集合而不是一个数组.上面的映射"key": true是Firebase上的一个集合的实现.

效率

有些人可能会认为数组是一种更有效的存储数据的方式,但对于Firebase而言并非如此:

你看到什么了:

"uIds" : [ "user1", "user2" ]
Run Code Online (Sandbox Code Playgroud)

Firebase存储的内容:

"uIds" : {
  "0": "user1",
  "1": "user2"
}
Run Code Online (Sandbox Code Playgroud)

所以存储一组几乎是一样的:

"uIds" : { 
  "user1": true, 
  "user2": true 
}
Run Code Online (Sandbox Code Playgroud)