Чтение данных из Hashmap - Android studio, Firebase

Вот изображение моей настройки базы данных Firebase:

Чтение данных из Hashmap - Android studio, 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, которая генерируется случайным образом?

Спасибо, парни

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
3 111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Дополнительная информация здесь, если вы хотите использовать класс модели.

Спасибо за это, Алекс, я действительно слишком запутался с этим, я дам тебе знать, как у меня дела

L Thompson 28.11.2018 17:57

Прекрасно работает, Алекс благодарит, теперь пытается извлечь эти данные из базы данных при нажатии на один из элементов в списке.

L Thompson 28.11.2018 19:37

Другие вопросы по теме