如何在Firebase中向阵列添加新对象

时间:2017-08-19 14:24:53

标签: android firebase

我的数据看起来像这样

enter image description here

我只想在索引3处添加一个对象。我怎么能在那里添加它。有没有办法在没有迭代的情况下添加一个对象,或者我必须迭代和getChildCount然后追加新的子(“3”)及其数据。

            TransGenderBO transGenderBO = new TransGenderBO();
            transGenderBO.setName("pushName");
            transGenderBO.setAge(13);

            mRef.child("").setValue(transGenderBO);

mRef中没有方法可以获取子计数并在3位添加新项目。

使用Frank代码后编辑但仍无法正常工作

            Query last = mRef.orderByKey().limitToLast(1);

            last.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    int lastIndex = 0;
                    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                        lastIndex = Integer.parseInt(childSnapshot.getKey());
                    }

                    TransGenderBO transGenderBO = new TransGenderBO();
                    transGenderBO.setName("pushName");
                    transGenderBO.setAge(13);
                    mRef.child(""+(lastIndex+1)).setValue(transGenderBO);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Toast.makeText(mContext,databaseError.getMessage(),Toast.LENGTH_LONG).show();
                }
            });

2 个答案:

答案 0 :(得分:1)

Firebase documentationblog建议不要在数据库中使用数组:对于用户可以脱机的多用户应用程序,它们不能很好地工作。

要在此处向阵列添加下一个元素,您必须至少下载数组的最后一个元素以了解下一个元素的索引:

Query last = root.orderByKey().limitToLast(1);
last.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int lastIndex;
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            lastIndex = Integer.parseInt(childSnapshot.getKey());
        }
        root.child(""+(lastIndex+1)).setValue(true);
    }

但这具有固有的竞争条件。当多个用户同时向阵列添加元素时,他们最终可能会写入相同的索引。

为了防止这种情况,你可以use a Firebase transaction。通过此操作,您可以从某个位置获取当前值,并在交换中返回您在该位置所需的新值。这可确保用户之间不会覆盖任何数据,但这意味着您必须下载整个阵列。

当用户未连接到网络时,这些方案都不起作用。

Firebase建议使用所谓的推送ID,其中包括:

  • 生成一个始终增加的密钥,该密钥保证是唯一的。
  • 不要求读取任何数据 - 它们是在客户端生成的,并且在统计上保证是唯一的。
  • 当用户离线时也可以使用。

唯一的缺点是它们不像数组索引那么容易读取。

答案 1 :(得分:0)

获取此类数据

private ArrayList<TransGenderBO> transGenderBO;
FirebaseDatabase.getInstance().getReference().child("Main")
            .addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        transGenderBO = (ArrayList<TransGenderBO>) dataSnapshot.getValue();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

并设置您的值

TransGenderBO transGender = new TransGenderBO();
    transGender.setName("pushName");
    transGender.setAge(13);
    FirebaseDatabase.getInstance().getReference().child("Main").child(String.valueOf(transGenderBO.size())).setValue(transGender);

或U也可以这样设置

TransGenderBO transGender = new TransGenderBO();
    transGender.setName("pushName");
    transGender.setAge(13);
   TransGenderBO.add(transGender);
    FirebaseDatabase.getInstance().getReference().child("Main")
  .setValue(transGenderBO);