【问题标题】:Android - Firebase RTDB retrieve and display dataAndroid - Firebase RTDB 检索和显示数据
【发布时间】:2020-04-18 09:58:58
【问题描述】:

您好,我想检索数据,但我没有看到任何显示,同时当我的数据库中没有数据时,我的应用程序崩溃了,所以至少看起来连接有效。我也是 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" />

我的数据库结构;:

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;
    }
}

【问题讨论】:

  • No setter/field for -LxFfqThHtNWsk9bD5Zb No setter/field for -LxFfqThHtNWsk9bD5Zb 似乎是我的问题,那是我在特定用户上的帖子的 id,所以可以,但我的班级中有 setter?跨度>
  • 请将您的数据库结构添加为 JSON 文件或至少一个屏幕截图和您的 NotesList 类的内容。
  • 我在原帖里加了。

标签: java android firebase firebase-realtime-database


【解决方案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);
    }
  }
  ...

如果你运行它,你可以看到它从你的数据库中加载了笔记。


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

使用您当前的代码和布局,您可以在 UI 中设置单个笔记的标题和文本:

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());
    }
  }
  ...

【讨论】:

  • I/System.out:来自 -LxFfo5HuRPQsBUSiFuc I/System.out 的阅读说明:com.example.examapplikation.Models.NotesList@993e940 来自 -LxFfqThHtNWsk9bD5Zb I/System.out 的阅读说明:com.example .exampapplikation.Models.NotesList@c8c0079 我明白了,但仍然没有显示
  • 我添加了我的数据库结构的链接
  • 或者现在我似乎没有将它们绑定到我的 xml?
  • 我添加了一个解释。但是我强烈建议您查看我在问题中提供的链接,因为您所问的很多内容已经在有关回收站视图(或在 Android 中显示项目列表的其他方式)的教程的其他地方得到了更好的教导,并从Firebase 进入列表/回收器视图。
  • 我错过了你之前写的感谢我现在使用回收站视图。
【解决方案2】:

即使我是一名初级 Android 开发人员,所以我认为您应该有一个单独的 Activity,其实例应该从此文件中调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2023-03-05
    相关资源
    最近更新 更多