gpt4 book ai didi

java - 如果我有下一个结构,如何从 Firebase 实时数据库检索所有数据?

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

我有一个应用程序,所有经过身份验证的用户都可以发布文章(标题、内容、用户名、日期)。我的结构如下:

structure db

我有节点帖子,并且我有来自不同用户的帖子。例如,我有用户 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

编辑:

您的问题中没有任何内容表明您希望获取所有用户的所有帖子,但是要实现此目的,您需要更改数据库结构以允许执行此类查询。使用您的实际数据库架构,这是不可能的。要解决此问题,您应该复制数据。这种做法称为非规范化,是 Firebase 的常见做法。为了更好地理解,我建议您观看此视频,Denormalization is normal with the Firebase Database .

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

话虽这么说,您应该创建另一个名为 allPosts 的节点,它将保存所有用户的所有帖子,如以下架构示例所示:

Firebase-root
|
--- allPosts
|
--- postId
|
--- //post details
|
--- uid: "eNAS ... tfz2"

如果您在 posts 节点上添加监听器,您将能够获取所有用户的所有帖子。

关于java - 如果我有下一个结构,如何从 Firebase 实时数据库检索所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56847626/

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