[英]How to retrieve all the data from a node in Android Firebase realtime database?
[英]How to retrieve all data from Firebase Realtime Database if I have the next structure?
我有一个应用程序,所有通过身份验证的用户都可以发布文章(标题,内容,用户名,日期)。 我有这样的结构:
在我有节点posts
,那里有来自不同用户的帖子。 例如,我有用户ID,并且该用户有不同的帖子,这些帖子由push()
方法键分开。 那么,如何从该结构检索所有数据(所有帖子)? 我有下一个代码,但我得到null
:
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child("posts").exists()) {
for (DataSnapshot dataSnapshot1 : dataSnapshot.child("posts").getChildren()) {
Post post = dataSnapshot1.getValue(Post.class);
mAdapter.addPost(post);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
showInformationDialog("Something went wrong! [initializing the list]");
}
});
我的模型课:
public class Post {
private String title;
private String content;
private String author;
private String date;
public Post() {
// default constructor
}
public Post(String title, String content, String author, String date) {
this.title = title;
this.content = content;
this.author = author;
this.date = date;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public String getAuthor() {
return author;
}
public String getDate() {
return date;
}
}
在根节点上添加侦听器根本不是一个好习惯,这意味着在整个数据库中发生的每一次更改都会通知您。 这是对带宽和资源的浪费。 要解决此问题,请将侦听器加深两个杠杆,如以下代码行所示:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("posts").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
Post post = ds.getValue(Post.class);
Log.d(TAG, post.getAuthor());
//Add the post object to a list and pass it to the adapter
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
您的logcat中的输出将是:
danchik_kilmez
编辑:
您的问题中没有任何内容表示您希望获得所有用户的所有帖子,但是要实现此目的,您需要更改数据库结构以允许您执行这样的查询。 使用实际的数据库模式是不可能的。 为了解决这个问题,您应该复制数据。 这种做法称为denormalization
,是Firebase的常见做法。 为了更好地理解,我建议您观看此视频, 使用Firebase数据库可以正常进行非规范化 。
另外,在复制数据时,请记住一件事。 用与添加数据相同的方式,您需要对其进行维护。 换句话说,如果您想更新/删除项目,则需要在它存在的每个位置进行。
话虽如此,您应该创建另一个名为allPosts
节点,该节点将保存所有用户的所有帖子,如以下架构示例所示:
Firebase-root
|
--- allPosts
|
--- postId
|
--- //post details
|
--- uid: "eNAS ... tfz2"
如果在posts
节点上添加侦听器,则可以获取所有用户的所有post。
您可以简单地使用FirebaseRecyclerOptions检索所有数据。
FirebaseRecyclerOptions<Post> options = new FirebaseRecyclerOptions.Builder<Post>()
.setQuery(YourRef,Post.class)
.build();
FirebaseRecyclerAdapter<Post,YAdapterHolder>adapter = new
FirebaseRecyclerAdapter<Post,YAdapterHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull final YAdapterHolder holder, final int position, @NonNull Post model) {
String userIds = getRef(position).getKey();
assert userIds != null;
YourRef.child(userIds).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount()!=0){
//example value retrive
Long data = dataSnapshot.child("data").getValue(Long.class);
String data1 = dataSnapshot.child("data1").getValue(String.class);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@NonNull
@Override
public YAdapterHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.pendinglistmodel,viewGroup,false);
return new YAdapterHolder(view);
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.