【问题标题】:How to retrieve the data in firebase?如何检索firebase中的数据?
【发布时间】:2018-11-19 16:25:49
【问题描述】:

我的数据库结构

我正在尝试创建一个可以显示所有日志的活动。只是时间戳和日志消息。我尝试过使用 firebaseUI 和适配器,但无法显示数据。我所做的最好的事情是在所有职位上发布相同的最后日志。这是我到目前为止但没有成功。我是 firebase 新手,我只需要在列表中显示日志。可以是lisViewrecyclerView。如果有人可以帮助我提供代码或示例。谢谢。

数据库结构为| "logs" node / userId / logId / fields |

    public class LogActivity extends AppCompatActivity {
    private static final String TAG = "LogActivity";
    private static final int ACTIVITY_NUM = 3;

    //widgets
    private Context mContext = LogActivity.this;
    private RecyclerView mLogRecycleView;
    private TextView timeStamp, log;

    //firebase
    private DatabaseReference mLogDatabase;
    private FirebaseAuth mAuth;

    //adapter
    private FirebaseRecyclerAdapter adapter;

    //vars
    private String mCurrentUserID, logID;
    List<AppLogs> logsList = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_log);
        Log.d(TAG, "onCreate: Started");

        mCurrentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();

        mLogRecycleView = findViewById(R.id.recyclerList);
        mLogDatabase = FirebaseDatabase.getInstance().getReference().child("logs").child(mCurrentUserID);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);

        mLogRecycleView.setHasFixedSize(true);
        mLogRecycleView.setLayoutManager(linearLayoutManager);

        firebaseListAdapter();

        mLogRecycleView.setAdapter(adapter);

        setupBottomNavigationView();
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }

    private void firebaseListAdapter() {
        Log.d(TAG, "firebaseListAdapter: started");

        Query logQuery = mLogDatabase.orderByChild("time");

        FirebaseRecyclerOptions<AppLogs> options =
                new FirebaseRecyclerOptions.Builder<AppLogs>()
                .setQuery(logQuery, AppLogs.class).build();

        adapter = new FirebaseRecyclerAdapter<AppLogs, LogViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull final LogViewHolder holder, int position, @NonNull AppLogs model) {
                Log.d(TAG, "onBindViewHolder: started");

                //get the ID of the messages
                //final String logID = getRef(position).getKey();
                //Log.d(TAG, "onBindViewHolder: logID : " + logID);



                Query logQuery = mLogDatabase;


                logQuery.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        for (DataSnapshot singData : dataSnapshot.getChildren()) {
                            //AppLogs logs = dataSnapshot.getValue(AppLogs.class);
                            Log.d(TAG, "onChildAdded: log:==== " + singData.child("log").getValue());
                            //Log.d(TAG, "onChildAdded: log_ID:==== " + logs.getLog_id());


                            String log =  singData.child("log").getValue().toString();
//                        String timeStamp = Long.toString(logs.getTime());
//
                        holder.setLog(log);
//                        holder.setTimeStamp(timeStamp);
                        }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });




            }

            @NonNull
            @Override
            public LogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                Log.d(TAG, "onCreateViewHolder: create users view holder: ");
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.layout_log_list_view, parent, false);
                return new LogViewHolder(view);
            }
        };

    }

    public static class LogViewHolder extends RecyclerView.ViewHolder {

        View mView;

        public LogViewHolder(View itemView) {
            super(itemView);
            this.mView = itemView;
        }

        public void setLog(String log) {
            TextView tvLog = mView.findViewById(R.id.tvLog);
            tvLog.setText(log);
        }

        public void setTimeStamp(String timeStamp) {
            TextView tvTimeStamp = mView.findViewById(R.id.tvTimeStamp);
            tvTimeStamp.setText(timeStamp);
        }
    }



    /*
     *BottomNavigationView Setup
     */
    private void setupBottomNavigationView() {
        Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
        BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx) findViewById(R.id.bottomNavViewBar);
        BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
        BottomNavigationViewHelper.enableNavigation(mContext, this, bottomNavigationViewEx);
        Menu menu = bottomNavigationViewEx.getMenu();
        MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
        menuItem.setChecked(true);
    }
}

还有我的日志模型类

package com.logistics.alucard.socialnetwork.Models;

公共类 AppLogs {

private String log, log_id;
private long time;

public AppLogs(String log, String log_id, long time) {
    this.log = log;
    this.log_id = log_id;
    this.time = time;
}

public AppLogs() {
}

public String getLog() {
    return log;
}

public void setLog(String log) {
    this.log = log;
}

public String getLog_id() {
    return log_id;
}

public void setLog_id(String log_id) {
    this.log_id = log_id;
}

public long getTime() {
    return time;
}

public void setTime(long time) {
    this.time = time;
}
}

【问题讨论】:

  • This 是一种推荐的方式,您可以通过这种方式从 Firebase 实时数据库中检索数据,并使用 FirebaseRecyclerAdapter 将其显示在 RecyclerView 中。
  • 也不需要使用mLogRecycleView.setHasFixedSize(true);
  • 谢谢。问题是我没有查询的日志 ID,我可以检索用户 ID,但我无法理解如何循环通过日志 ID 并将每个日志 ID 中的数据检索到 recycler view。我不确定如何构造查询。

标签: android listview firebase-realtime-database android-recyclerview firebaseui


【解决方案1】:

我设法弄明白了!谢谢您的帮助。还是有点迷茫怎么做 构建查询,但我会努力变得更好:)

这是我对firebase检索数据的解决方案:

protected void onBindViewHolder(@NonNull final LogViewHolder holder, int position, @NonNull AppLogs model) {
            Log.d(TAG, "onBindViewHolder: started");

            //get the ID of the messages
            final String logID = getRef(position).getKey();
            //Log.d(TAG, "onBindViewHolder: logID : " + logID);



            Query logQuery = mLogDatabase;


            logQuery.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {


                   //AppLogs appLogs = dataSnapshot.getValue(AppLogs.class);
                    //Log.d(TAG, "onDataChange: logs:---------" + dataSnapshot.child(logID).child("log").getValue());
                    String log = dataSnapshot.child(logID).child("log").getValue().toString();
                    String timeStamp = dataSnapshot.child(logID).child("time").getValue().toString();
                    Log.d(TAG, "onDataChange: logs:--------------" + log);

                    holder.setLog(log);
                    holder.setTimeStamp(timeStamp);

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多