Android-Firebase RTDB检索和显示数据

时间:2019-12-29 07:23:12

标签: java android firebase firebase-realtime-database

你好,我想检索数据,但没有看到任何显示,同时,当我的数据库中没有数据时,我的应用程序崩溃,因此至少看起来连接可以正常工作。我也是Android Studio的初学者。

注意:这是来自an earlier question的后续问题。

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

    Title = findViewById(R.id.tvNoteTitle);
    text = findViewById(R.id.TvNoteText);
    addNotePageButton = findViewById(R.id.fab_button_addPage);
    firebaseDatabase = FirebaseDatabase.getInstance();

    firebaseAuth = FirebaseAuth.getInstance(); // get inSTACE

    // acsess database and retrive data

    FirebaseDatabase.getInstance().getReference("NoteList").child(firebaseAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        NotesList notelist = dataSnapshot.getValue(NotesList.class);
        Title.setText( notelist.getTitle());
        text.setText(notelist.getText());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(HomeActivity.this,databaseError.getCode(),Toast.LENGTH_SHORT).show();
        }
    });
}

我想知道是否将显示用户的所有注释还是仅显示第一个注释?我也想知道是否可以在不使用视图持有人或其他任何东西的情况下向每个注释添加删除按钮

这是该视图相对布局的XML

<TextView
    android:id="@+id/tvNoteTitle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="64dp"
    android:text="Title: "
    android:textSize="28dp"

    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.503"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="parent" />

<TextView
    android:id="@+id/TvNoteText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="356dp"
    android:text="Text: "
    android:textSize="22dp"

    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tvNoteTitle"
    app:layout_constraintVertical_bias="0.653" />

我的数据库结构;

firebase database structure

public class NotesList {

    private String title;
    private String text;

    public NotesList(){

    }

    public NotesList(String title, String text){

        this.title=title;
        this.text= text;

    }

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

2 个答案:

答案 0 :(得分:1)

您在评论中发布了这些错误消息:

  

-LxFfqThHtNWsk9bD5Zb没有设置器/字段

     

-LxFfqThHtNWsk9bD5Zb没有设置器/字段

这通常意味着您正在尝试解析JSON数据中的错误级别。您正在尝试将具有子节点-LxFfqThHtNWsk9bD5Zb-LxFfqThHtNWsk9bD5Zb的节点解析为不具有该名称属性的对象。

您很有可能在/NoteList/$uid下为每个用户有一个列表注释,这意味着您还需要通过遍历以下子项来处理onDataChange中的该列表:您获得的快照。这样的事情应该可以解决问题:

FirebaseDatabase.getInstance().getReference("NoteList").child(firebaseAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    for (DataSnapshot noteSnapshot: dataSnapshot.getChildren()) {
      System.out.println("Reading note from "+noteSnapshot.getKey());

      NotesList notelist = noteSnapshot.getValue(NotesList.class);

      System.out.println(notelist);
    }
  }
  ...

如果运行此命令,则可以看到它从数据库中加载了注释。


要在应用程序中显示笔记列表,您需要使用“回收站视图”。但我强烈建议您阅读tutorial on how to do that,而不是在此重复。另外,您可以使用FirebaseUI中的适配器来填充回收站视图,而不是构建自己的适配器。

使用当前代码和布局,您可以使用以下方法在用户界面中设置单个便笺的标题和文本:

FirebaseDatabase.getInstance().getReference("NoteList").child(firebaseAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    for (DataSnapshot noteSnapshot: dataSnapshot.getChildren()) {
      System.out.println("Reading note from "+noteSnapshot.getKey());

      NotesList notelist = noteSnapshot.getValue(NotesList.class);

      Title.setText(notelist.getTitle());
      text.setText(notelist.getText());
    }
  }
  ...

答案 1 :(得分:0)

即使我是Android的初学者,所以我认为您应该有一个单独的活动,该活动的实例应从该文件中调用。