这是我的Firebase结构
我正在尝试选择具有相同日期的所有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是我的模型(是什么叫它?)用于存储和向回收器适配器提供值的类
有更好的方法吗?我需要按日期对这些进行排序,我考虑重组数据库,但我更愿意,如果有另一种方式。
原谅我凌乱的代码,一旦我开始工作,我打算修复它。感谢您提前提供任何帮助。
答案 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) {
}
});
希望这至少在某种程度上有所帮助,如果你仍然遇到任何问题,请告诉我。
<强>干杯强>