gpt4 book ai didi

java - 如何以reference-id关系查询Firebase中的所有信息

转载 作者:行者123 更新时间:2023-11-29 04:53:40 25 4
gpt4 key购买 nike

我正在构建一个包含视频提要的 Android 应用程序,例如 Facebook 的提要页面,但带有视频。在 Firebase 中,我有两个根元素“posts”和“videos”(以下是数据结构的简化版本)。

{
"posts": {
"postId1": {
"createdAt": "15/05/2014 15:03:45",
"section": "trending",
"type": "videoPost",
"videoId": "7hPMmzKs62w"
},
"postId2": {
"createdAt": "15/05/2014 11:03:45",
"section": "home",
"type": "videoPost",
"videoId": "Lp9GgdCgMXk"
}
}
,
"videos": {
"7hPMmzKs62w": {
"credits": "The War on Drugs",
"duration": "2:53",
"title": "Red Eyes"
},
"Lp9GgdCgMXk": {
"credits": "Shamir",
"duration": "2:57",
"title": "On the Regular"
}
}
}

如您所见,每个帖子都与特定视频相关。每个帖子都有一个 videoId 属性,其中包含视频的 ID。我想出这个设计是为了避免在视频和每个帖子上重复视频信息。

在我的应用程序中,我有两个类 PostFB 和 VideoFB 来保存帖子和视频信息。每个 PostFB 对象都有一个对 VideoFB 对象的引用。为了获取所有帖子及其相应的视频,我在以下类中使用了 getPosts 方法。

public class DatabaseHelper {
private int numVideosFetched = 0;

public final void getPosts(final PostsDownloadedListener listener, String genre) {
final Firebase ref = new Firebase("https://leaffm-dev.firebaseio.com");
numVideosFetched = 0;
final List<PostFB> posts = new ArrayList<PostFB>();

//Query 1: Get the posts from Firebase
ref.child("/posts").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
//The expectedVideosToFetched is equals to the number of posts since each post must have a video associated

final long expectedVideosToFetched = snapshot.getChildrenCount();

//For each post
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
final PostFB post = postSnapshot.getValue(PostFB.class);

post.setKey(postSnapshot.getKey());
String videoId = post.getVideoId();

//Get the corresponding video using videoId
ref.child("videos/" + videoId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onCancelled(FirebaseError firebaseError) {
}

@Override
public void onDataChange(DataSnapshot snapshot) {
VideoFB video = snapshot.getValue(VideoFB.class);
//Set the video to the post
post.setVideo(video);
numVideosFetched++;

//When all the videos have been downloaded, then let the listener know
if (numVideosFetched >= expectedVideosToFetched) {
listener.onSuccess(posts);
}
}
});
posts.add(post);
}
}

@Override
public void onCancelled(FirebaseError firebaseError) {
listener.onError(firebaseError);
}
});
}
}

如您所见,我获取了所有帖子,然后针对每篇帖子读取其 videoId 值并进行内部查询以从 firebase 获取相应的视频。为了知道何时下载了所有信息,我使用了一个计数器来跟踪到目前为止下载或获取的视频数量。当此计数与预期数量相匹配时,我就会让听众知道数据已准备好显示。

问题是,在这种情况下,是否还有其他方法可以使用引用 ID 获取所有信息?或者这是糟糕的数据设计的标志?我问第二个问题是因为一种选择是进一步扁平化数据并在帖子中包含所有视频的信息,如下所示:

"posts": {
"postId1": {
"createdAt": "15/05/2014 15:03:45",
"section": "trending",
"type": "videoPost",
"video": {
"credits": "The War on Drugs",
"duration": "2:53",
"title": "Red Eyes"
},
}

但我担心的是,在某些时候,在进一步的开发中我需要引用 ID,就像在这种情况下帖子和视频之间的关系一样。

最佳答案

避免重复数据不一定是好事。管理它需要更多工作,但如果您为每个用例使用定制的数据结构,用户体验会更快。您可以将视频存储在帖子中,如果需要,可以将其 ID 作为属性。

"posts_with_video": {
"postId1": {
"createdAt": "15/05/2014 15:03:45",
"section": "trending",
"type": "videoPost",
"video": {
"id": "videoID1",
"credits": "The War on Drugs",
"duration": "2:53",
"title": "Red Eyes"
}
}
}

如果您只需要引用关系而不需要整个帖子或视频,那么您可以为此创建单独的 inode 。 (假设下面的关系是多对一的)

"posts_video": {
"postId1": "videoID1",
"postId2": "videoID4",
"postId3": "videoID1"
},
"video_posts": {
"videoID1": {
"postId1": true,
"postId3": true
},
"videoID4": {
"postId2": true
}
}

虽然这看起来需要处理很多,Firebase's multi-path updates使管理变得非常容易。

关于java - 如何以reference-id关系查询Firebase中的所有信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503115/

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