【问题标题】:Reading data from a Hashmap - Android studio, Firebase从 Hashmap 读取数据 - Android Studio、Firebase
【发布时间】:2019-04-30 15:31:42
【问题描述】:

这是我的 Firebase 数据库设置的图像:

我正在尝试编写一个简单的笔记应用程序,我能够将所有内容保存到 Firebase,但难以检索信息。

用户 ID 的一个孩子是随机生成的,这导致我在尝试检索数据时出现问题。下面的代码是我如何将所有数据保存到 Firebase 数据库。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_progress_reports);

    findViewById(R.id.saveNoteButton).setOnClickListener(saveReport);
    progressReportTitle = findViewById(R.id.progressReportTitle);
    progressReportContent = findViewById(R.id.progressReportContent);

    fAuth = FirebaseAuth.getInstance();
    fProgressReportsDatabase = FirebaseDatabase.getInstance().getReference().child("ProgressReports").child(fAuth.getCurrentUser().getUid());

    findViewById(R.id.loadNoteButton).setOnClickListener(loadReports);
}

View.OnClickListener saveReport = new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        String title = progressReportTitle.getText().toString().trim();
        String content = progressReportContent.getText().toString().trim();

        if (title.isEmpty()) {
            progressReportTitle.setError("Please Enter a title for this report");
            progressReportTitle.requestFocus();
        } else if (content.isEmpty()) {
            progressReportContent.setError("No content within report");
            progressReportContent.requestFocus();
        } else {
            saveReportToDB(title, content);
        }
    }
};

private void saveReportToDB(String title, String content) {

    if (fAuth.getCurrentUser() != null) {
        final DatabaseReference newProgressReportRef = fProgressReportsDatabase.push();
        final Map progressReportMap = new HashMap();
        progressReportMap.put("title", title);
        progressReportMap.put("content", content);
        progressReportMap.put("timestamp", ServerValue.TIMESTAMP);

下面是我如何尝试将这些数据加载到单独活动的列表视图中,但没有运气,

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_view);

    mListView = (findViewById(R.id.progressList));

    fAuth = FirebaseAuth.getInstance();
    fFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef = FirebaseDatabase.getInstance().getReference().child("ProgressReports").child(fAuth.getCurrentUser().getUid());;
    FirebaseUser user = fAuth.getCurrentUser();
    userID = user.getUid();


    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            showData(dataSnapshot);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}


private void showData(DataSnapshot dataSnapshot){
    for(DataSnapshot ds : dataSnapshot.getChildren()){
        ReportInformation rInfo = new ReportInformation();
        rInfo.setTitle(ds.child(userID).child("title").getValue(ReportInformation.class).getTitle());
        rInfo.setContent(ds.child(userID).child("content").getValue(ReportInformation.class).getContent());
        //rInfo.setTimestamp(ds.child(userID).child("timestamp").getValue().toString());

        ArrayList<String> array = new ArrayList<>();
        array.add(rInfo.getTitle());
        array.add(rInfo.getContent());
        //array.add(rInfo.getTimestamp());
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array);
        mListView.setAdapter(adapter);

    }
}

我做错了什么,如何在数据库中查询随机生成的HashMap

谢谢大家

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    要在ListView 中显示所有这些对象的所有标题,请使用以下代码行:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("ProgressReports").child(uid);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<String> list = new ArrayList<>();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String title = ds.child("title").getValue(String.class);
                list.add(title);
                Log.d("TAG", title);
            }
            ListView listView = (ListView) findViewById(R.id.list_view);
            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, list);
            listView.setAdapter(arrayAdapter);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    uidRef.addListenerForSingleValueEvent(eventListener);
    

    您的列表将包含两个标题:

    Test
    Test
    

    更多信息here如果你想使用模型类。

    【讨论】:

    • 感谢这个 Alex,我真的让自己对它感到困惑,让你知道我是怎么过的
    • 工作魅力 Alex 感谢,现在在单击列表视图中的一个项目时尝试从数据库中拉回该数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2019-08-29
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多