Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase使用Cardview检索实时数据_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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());
}