java - 如何在 Firebase 中更改未知父级的子级值 - Android
问题描述
我正在开发一个 Firebase 聊天应用程序。我一直在尝试更改 Firebase 中未知父级的子级值,但我无法正确处理。
这是我的 Firebase 数据库结构:
我想在用户打开消息活动时将“看到”的值更改false
为。true
每条消息都有一个推送 id,我不知道它的值。我希望能够编辑推送 id 的孩子。
这是我的代码:
DatabaseReference messageRef = mRootRef.child("messages").child(mCurrentUserId).child(mChatUser);
messageRef.child("seen").setValue(true).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d("isseen", "Seen set to true");
} else {
Log.d("isseen", "Seen not set to true");
}
}
});
我怎样才能最好地达到我想要的结果?
解决方案
要解决此问题,您需要使用查询。所以请使用以下代码行:
DatabaseReference messageRef = mRootRef.child("messages").child(mCurrentUserId).child(mChatUser);
Query query = messageRef.orderByChild("seen").equalTo(false);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
ds.child("seen").getRef().setValue(true);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);
结果会将您的seen
财产从更改false
为true
。
如果您在某个时候还考虑尝试使用Cloud Firestore,您可以在此处找到有关如何使用 Kotlin 创建完整且功能强大的 Firestore 聊天应用程序的教程。
推荐阅读
- trix - 有没有一种简单的方法可以从 Trix 工具栏中删除特定按钮,而无需创建自定义工具栏
- angular - Angular: Error: Local workspace file ('angular.json') could not be found
- rust - 在 Rust 中,堆栈上发生了什么,堆上发生了什么?
- javascript - Angular mat-select 在移动设备或低宽度设备上无法正确显示选项
- eigen - 求解稀疏欠定系统
- android - 清单中 supportRTL false 的 setMarginStart 的奇怪行为
- firebase - 错误:程序类型已存在:com.google.firebase.auth.UserInfo
- shopify - 当产品有变量时,如何在“添加到购物车”中显示“选择您的选项”?
- vuejs2 - 如何在 VueJS 中将 HTML 转换为不同的类型?
- python - 如何使用 python 3 查找损坏的 mp3 文件?