Java Firebase使用Cardview检索实时数据
基本上,我正在制作一个应用程序,我在其中使用Java Firebase使用Cardview检索实时数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,基本上,我正在制作一个应用程序,我在其中使用firebase并尝试检索实时数据库,就像我在firebase存储中存储图像一样,复制“下载URL”链接并粘贴到firebase数据库中,这样每当我运行我的应用程序时,应该有一个图片,标题和描述应该在下面。我基本上想向firebase数据库添加图像、标题和描述,并在应用程序中检索 主要活动:-- 主要活动:-- Firebase数据库结构:- demofirebase-1faa 邮政1 -Description1="First Post" -Imag
firebase
并尝试检索实时数据库
,就像我在firebase存储中存储图像一样,复制“下载URL”链接并粘贴到firebase数据库中,这样每当我运行我的应用程序时,应该有一个图片,标题和描述应该在下面。我基本上想向firebase数据库添加图像、标题和描述,并在应用程序中检索
主要活动:--
主要活动:--
Firebase数据库结构:-
demofirebase-1faa
- 邮政1
-Description1="First Post"
-Image1="https://firebasestorage.googleapis.com/v0/b/demofirebase-1faaa.appspot.com/o/Unknown.jpg?alt=media&token=6f5ade3c-d615-4871-90a0-1b4a55e6e00c"
-Title1="Namy"
- 邮政2
-Description2="Second Post"
-Image2="https://firebasestorage.googleapis.com/v0/b/demofirebase-1faaa.appspot.com/o/Unknown.jpg?alt=media&token=6f5ade3c-d615-4871-90a0-1b4a55e6e00c"
-Title2="Naman"
您不能将Image1
、Image2
等作为Firebase数据库中的密钥。每个节点中的密钥必须始终相同。您的数据库应如下所示:
demofirebase-1faa
|
--- Post1
| |
| --- Description: "First Post"
| |
| --- Image: "https://firebasestorage.googleapis.com/v0/b/demofirebase-1faaa.appspot.com/o/Unknown.jpg?alt=media&token=6f5ade3c-d615-4871-90a0-1b4a55e6e00c"
| |
| --- Title: "Namy"
|
--- Post2
|
--- Description: "Second Post"
|
--- Image: "https://firebasestorage.googleapis.com/v0/b/demofirebase-1faaa.appspot.com/o/Unknown.jpg?alt=media&token=6f5ade3c-d615-4871-90a0-1b4a55e6e00c"
|
--- Title: "Naman"
要根据此数据库架构获取图像,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String image = ds.child("image").getValue(String.class);
Log.d("TAG", image);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
rootRef.addListenerForSingleValueEvent(eventListener);
假设您已经正确配置了项目,您可以通过获取引用、创建新节点(正如Alex Mamo所说,没有特定节点您就无法发送数据)并在其中安装对象来将数据发送到firebase。见下文:
// get your reference
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
// refer your child and use push to generate a new unique node, then put your object
reference.child("blog").push().setValue(blog);
连接firebase和适配器可以通过两种方式完成:在检索对象时显示对象或一次显示所有对象
逐对象:
创建用于接收项目的接口:
public interface ItemListener<T> {
void onItemAdded(@NonNull final T item);
void onItemRemoved(@NonNull final T item);
}
在适配器内部,在构造函数中调用上述方法,将收到的博客发送到列表并通知:
public class Adapter extends RecyclerView.Adapter<BlogViewHolder> {
private List<Blog> mBlogList;
public Adapter() {
getBlogList(new ItemListener<Blog>() {
@Override
public void onItemAdded(@NonNull final Blog blog) {
mBlogList.add(blog);
notifyItemInserted(mBlogList.size);
}
@Override
public void onItemRemoved(@NonNull final Blog blog) {
for (Integer i = 0; i < mBlogList.size(); i++) {
final Blog innerBlog = mBlogList.get(i);
// since you don't store a key, you gotta check all attributes
if (innerBlog.getTitle.equals(blog.getTitle) &&
innerBlog.getDescription.equals(blog.getDescription) &&
innerBlog.getImage.equals(blog.getImage)) {
mBlogList.remove(innerBlog);
notifyItemRemoved(i);
}
}
}
});
}
@Override
public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new BlogViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.individual_row, parent, false));
}
@Override
public void onBindViewHolder(BlogViewHolder holder, int position) {
final Blog blog = holder.get(position);
holder.setTitle(blog.getTitle());
holder.setDescription(blog.getDescription());
holder.setImage(blog.getImage());
}
@Override
public int getItemCount() {
return mBlogList.size();
}
}
public class Adapter extends RecyclerView.Adapter<BlogViewHolder> {
private List<Blog> mBlogList;
public Adapter() {
getBlogList(new ListListener<Blog>() {
@Override
public void onListRetrieved(@NonNull final List<Blog> blogList) {
mBlogList.addAll(blogList);
notifyDataSetChanged();
}
});
}
// same code as first Adapter
}
请添加您的数据库结构。@AlexMamo我已经添加了数据库结构。请正确添加。您想确切知道什么?如何发送数据或如何检索数据并正确放入卡?@HugoCastelani是的,我想知道如何存储数据,然后检索或正确放入应用程序我应该在哪里添加此代码,我应该删除我的原始代码@AlexMamoThis不是复制粘贴代码。这是查询数据库以获得所需结果的方法。但首先,您需要具有上述模式中的数据库结构。问题解决了,实际上我在firebase数据库中使用了“Image”,而在主要活动中我使用了“Image”。这就是我不做任何事情的原因。你认为我的答案对你有帮助吗?我建议为每个代码部分创建一个单独的文件。
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String image = ds.child("image").getValue(String.class);
Log.d("TAG", image);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
rootRef.addListenerForSingleValueEvent(eventListener);
// get your reference
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
// refer your child and use push to generate a new unique node, then put your object
reference.child("blog").push().setValue(blog);
public interface ItemListener<T> {
void onItemAdded(@NonNull final T item);
void onItemRemoved(@NonNull final T item);
}
public void getBlogList(@NonNull final ItemListener listener) {
FirebaseDatabase.getInstance().getReference().child("blog").orderByKey()
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
final Blog blog = dataSnapshot.getValue(Blog.class);
listener.onItemAdded(blog);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
final Blog blog = dataSnapshot.getValue(Blog.class);
listener.onItemRemoved(blog);
}
@Override public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
@Override public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
@Override public void onCancelled(DatabaseError databaseError) {}
});
}
public class Adapter extends RecyclerView.Adapter<BlogViewHolder> {
private List<Blog> mBlogList;
public Adapter() {
getBlogList(new ItemListener<Blog>() {
@Override
public void onItemAdded(@NonNull final Blog blog) {
mBlogList.add(blog);
notifyItemInserted(mBlogList.size);
}
@Override
public void onItemRemoved(@NonNull final Blog blog) {
for (Integer i = 0; i < mBlogList.size(); i++) {
final Blog innerBlog = mBlogList.get(i);
// since you don't store a key, you gotta check all attributes
if (innerBlog.getTitle.equals(blog.getTitle) &&
innerBlog.getDescription.equals(blog.getDescription) &&
innerBlog.getImage.equals(blog.getImage)) {
mBlogList.remove(innerBlog);
notifyItemRemoved(i);
}
}
}
});
}
@Override
public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new BlogViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.individual_row, parent, false));
}
@Override
public void onBindViewHolder(BlogViewHolder holder, int position) {
final Blog blog = holder.get(position);
holder.setTitle(blog.getTitle());
holder.setDescription(blog.getDescription());
holder.setImage(blog.getImage());
}
@Override
public int getItemCount() {
return mBlogList.size();
}
}
public interface ListListener<T> {
void onListRetrieved(@NonNull final List<T> list);
}
public void getBlogList(@NonNull final ListListener listener) {
final List<Blog> blogList = new ArrayList<>();
FirebaseDatabase.getInstance().getReference().child("blog")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (final DataSnapshot innerDataSnapshot : dataSnapshot.getChildren()) {
final Blog blog = innerDataSnapshot.getValue(Blog.class);
blogList.add(blog);
}
listener.onListRetrieved(blogList);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
public class Adapter extends RecyclerView.Adapter<BlogViewHolder> {
private List<Blog> mBlogList;
public Adapter() {
getBlogList(new ListListener<Blog>() {
@Override
public void onListRetrieved(@NonNull final List<Blog> blogList) {
mBlogList.addAll(blogList);
notifyDataSetChanged();
}
});
}
// same code as first Adapter
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
recyclerView.setAdapter(new Adapter());
}