java - 从 Hashmap 读取数据 - Android studio、Firebase

标签 java android firebase firebase-realtime-database

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

Firebase database setup

我正在尝试编写一个简单的笔记应用程序,我能够将所有内容保存到 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);

下面是我尝试将此数据加载到单独 Activity 的 ListView 中的方法,但没有成功,

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

谢谢大家

最佳答案

要在 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 如果您想使用模型类。

关于java - 从 Hashmap 读取数据 - Android studio、Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524293/

相关文章:

java - 使用 servlet 显示 jfreecharts

java - 断言或mockito验证可重用性-错误行

android - 如何在react-native android应用程序中单击时将铃声模式更改为静音/响铃/振动?

android - Firebase 通知 : Easiest way to implement opt-out

ios - 跨 iOS 设备保持 Firebase 身份验证状态

android - 如何将Firebase和Snap Creative Kit作为Gradle依赖项包括在内

java - 如何让背景框的JtextField成为焦点?

java - 如何限制EditText输入只允许3位整数或小数

android - 未捕获的语法错误 : Unexpected identifier when async/await is present

Android屏幕捕获或从图像制作视频