gpt4 book ai didi

java - Firebase:引用节点上的OrderbyChild,在onDataChange中返回NULL快照

转载 作者:行者123 更新时间:2023-12-02 10:26:10 25 4
gpt4 key购买 nike

我正在尝试在引用节点上调用oderByChild,并将日期作为嵌套项。它说:

paymentIDs->userIDXX1->orderID->date:"1254785xxxx" return NULL in onDatechange() .indexOn:date is also provided on node paymentIDs

mFirebaseDatabase = FirebaseDatabase.getInstance();

Query listpayment = mFirebaseDatabase.getReference("paymentIDs").orderByChild("date").startAt(fromdateinLong).endAt(todateinLong);

listpayment.addListenerForSingleValueEvent(valueEventListener);

ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

Log.e(TAG,"valueEventListener: OnDatachanged" );
if (dataSnapshot.exists()) {
//if not null, do something.
}

}
}

@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG,"valueEventListener: OnCancelled" );
}
};

enter image description here

最佳答案

您得到 null 因为您缺少一个子项,即用户的 ID。要解决此问题,请更改以下代码行:

Query listpayment = mFirebaseDatabase.getReference("paymentIDs").orderByChild("date").startAt(fromdateinLong).endAt(todateinLong);

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Query listpayment = mFirebaseDatabase.getReference()
.child("paymentIDs")
.child(uid)
.orderByChild("date")
.startAt(fromdateinLong).endAt(todateinLong);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String userId = ds.child("userId").getValue(String.class);
Log.d(TAG, userId);
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
listpayment.addListenerForSingleValueEvent(valueEventListener);

编辑:

根据您的评论,您应该知道使用此数据库架构您无法获得所有用户下的所有付款。在 Firebase 中无法使用通配符。所以像这样的查询:

Query listpayment = mFirebaseDatabase.getReference()
.child("paymentIDs")
.child(?)
.orderByChild("date")
.startAt(fromdateinLong).endAt(todateinLong);

不允许。为了解决这个问题,有一个解决方法,这意味着您需要复制数据。因此,您应该创建另一个节点,在其中添加所有用户的所有付款。这种做法称为非规范化,是 Firebase 的常见做法。为了更好地理解,我建议您观看此视频,Denormalization is normal with the Firebase Database .

此外,当您复制数据时,需要记住一件事。就像添加数据一样,您也需要维护它。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都进行操作。

不幸的是,使用实际的数据库结构你无法实现你想要的。

关于java - Firebase:引用节点上的OrderbyChild,在onDataChange中返回NULL快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53944951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com