尝试在Firebase中选择查询位置并将数据添加到recyclerview

时间:2018-03-14 22:12:33

标签: android firebase firebase-realtime-database

这是我的Firebase结构

Firebase JSON

我正在尝试选择具有相同日期的所有ID并使用它填充回收站视图,这是我的代码段:

 private void updateValues()
    {
        if(rAuth !=null && rUser!=null)
        {
            final String date="15/03/2018";
            final DatabaseReference rRef =
                    FirebaseDatabase.getInstance().getReference()
                    .child("Users")
                    .child("Transactions");

            rRef.child("Expense").addValueEventListener(new ValueEventListener()
            {
                @Override
                public void onDataChange(DataSnapshot rSnap)
                {
                    for(DataSnapshot d: rSnap.getChildren())
                    {
                        rRef.child(d.getKey())
                                .child("Date")
                                .addListenerForSingleValueEvent(new ValueEventListener()
                                {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot)
                                    {
                                        if(date.equals(dataSnapshot.getValue().toString()))
                                        {
                                            recordItems.add(new recordItems(iconGetter(d.child("Type").getValue().toString()),
                                                    d.child("Description").getValue().toString(),
                                                    d.child("Type").getValue().toString(),
                                                    d.child("Value").getValue().toString(),
                                                    d.child("Date").getValue().toString()));
                                        }
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError)
                                    {

                                    }
                                });
                    }
                    initRecycler();
                }

                @Override
                public void onCancelled(DatabaseError databaseError)
                {

                }
            });

现在,因为我正在尝试从内部类访问DataSnapshot d,我需要将其设置为final,但如果我这样做,我就不能再迭代它了。我有点卡在这里,因为这是我第一次使用Firebase。我过去只使用过SQL。

recordItems是我的模型(是什么叫它?)用于存储和向回收器适配器提供值的类

有更好的方法吗?我需要按日期对这些进行排序,我考虑重组数据库,但我更愿意,如果有另一种方式。

原谅我凌乱的代码,一旦我开始工作,我打算修复它。感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:2)

首先,您应该修复这些代码行并添加User-id:

 final DatabaseReference rRef =
                FirebaseDatabase.getInstance().getReference()
                .child("Users")
                .child("Transactions");

看起来应该是这样的:

 final DatabaseReference rRef =
                FirebaseDatabase.getInstance().getReference()
                .child("Users")
                .child(userId)
                .child("Transactions");

现在,如果您想提高代码效率,可以只使用下一个查询获得所需的日期:

 final Query refQuery =
                FirebaseDatabase.getInstance().getReference()
                .child("Users")
                .child(userId)
                .child("Transactions")
                .child("Expense")
                .orderByChild("Date").equalTo(date);

然后,您甚至不需要调用addListenerForSingleValueEvent方法,因为Firebase Realtime-Database始终会检索指定参考的所有子项。

所以你需要的是在foreach循环中添加你的代码行:

for (DataSnapshot d : dataSnapshot.getChildren()){ 
     recordItems.add(new recordItems(iconGetter(d.child("Type").getValue().toString()),
           d.child("Description").getValue().toString(),
           d.child("Type").getValue().toString(),
           d.child("Value").getValue().toString(),
           d.child("Date").getValue().toString()));
}

并且在使用adapter.notifyDataSetChanged()将所有新项目添加到列表中之后不要忘记通知您适配器,当然在您在整个代码的开头调用initRecycler();之后。

希望我帮忙! 欢迎您查看我的解决方案并告知是否存在任何问题

答案 1 :(得分:1)

如果您想根据给定日期检索所有Expense个孩子

您需要将给定的date值声明为Global。

我建议您使用addChildEventListener并覆盖所有方法。

然后,您必须创建一个pojo class来获取对象形式的所有值。

尝试一下:

首先创建一个名为

的类
ExpenseModel.java

粘贴它。

public class ExpenseModel {

    String Date,Description,Type,Value;

    public  ExpenseModel(){

    }


    public ExpenseModel(String date, String description, String type, String value) {


        Date = date;
        Description = description;
        Type = type;
        Value = value;
    }




    public String getDate() {


        return Date;
    }

    public void setDate(String date) {


        Date = date;
    }

    public String getDescription() {


        return Description;
    }

    public void setDescription(String description) {


        Description = description;
    }

    public String getType() {


        return Type;
    }

    public void setType(String type) {


        Type = type;
    }

    public String getValue() {


        return Value;
    }

    public void setValue(String value) {


        Value = value;
    }
}

并且该方法应该是这样的

final String date="15/03/2018";

private void updateValues()
{
    if(rAuth !=null && rUser!=null)
    {
        final DatabaseReference rRef =
                FirebaseDatabase.getInstance().getReference()
                        .child("Users")
                        .child("Transactions");

        rRef.child("Expense").addChildEventListener(new ChildEventListener() {









            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {


                ExpenseModel expenseModel =  dataSnapshot.getValue(ExpenseModel.class);



                assert expenseModel != null;
                if(expenseModel.getDate().equals(date)){


                    // Add it to the recyclerView
                    // And call notifyDataSetChanged()

                    yourAdapter.add(expenseModel);
                    yourAdapter.notifyDataSetChanged();


                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {


            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {


            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {


            }
        });

希望这至少在某种程度上有所帮助,如果你仍然遇到任何问题,请告诉我。

<强>干杯