【问题标题】:Retrieving data from Firebase Realtime Database in Android - recyclerview从 Android 中的 Firebase 实时数据库中检索数据 - recyclerview
【发布时间】:2022-02-11 19:41:51
【问题描述】:

我正在尝试从 Firebase 实时数据库中检索数据并在 recyclerview 中显示这些数据,但我做不到,我不明白为什么,因为我尝试了所有方法(Google / StackOverflow 等),但没有任何效果。

代码似乎没问题,但是当我运行应用程序时,它给了我以下消息:No setter/field for Surname found on class com.example.ipill.Users

我检查了如何解决问题,但没有任何效果,我删除并创建了几次数据库,但没有任何效果。

我是 Android Studio 的新手,我不明白我做错了什么。

下面我将附上代码和数据库。我不明白的是,当我使用 Name = Alex 向数据库添加一个新对象时,我可以看到新的回收器视图中包含一个新项目,这意味着应用程序知道还有更多具有 Name = 的对象亚历克斯,但我不能从数据库中检索该对象的。

提前谢谢你。

代码活动

package com.example.ipill;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.GenericTypeIndicator;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class FirebaseSearch extends AppCompatActivity {

private EditText mSearchField;
private ImageButton mSearchBtn;

private RecyclerView mResultList;



private DatabaseReference mUserDatabase;

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

    mUserDatabase = FirebaseDatabase.getInstance().getReference("Users");

    mSearchField = (EditText) findViewById(R.id.search_field);

    mSearchBtn = findViewById(R.id.search_btn);
    mResultList = (RecyclerView)findViewById(R.id.result_list);

    mResultList.setHasFixedSize(true);
    mResultList.setLayoutManager(new LinearLayoutManager(this));

    mSearchBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String searchText = mSearchField.getText().toString();

            firebaseUserSearch(searchText);

        }
    });


}

private void firebaseUserSearch(String searchText) {

    Toast.makeText(FirebaseSearch.this, "Started Search", Toast.LENGTH_LONG).show();

    Query firebaseSearchQuery = mUserDatabase.orderByChild("Name").startAt(searchText).endAt(searchText + "\uf8ff");

    FirebaseRecyclerAdapter<Users, UsersViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, UsersViewHolder>(

            Users.class,
            R.layout.list_layout,
            UsersViewHolder.class,
            firebaseSearchQuery

    ) {
        @Override
        protected void populateViewHolder(UsersViewHolder viewHolder, Users model, int position) {
            viewHolder.setDetails(model.getName(), model.getSurname());

        }
    };

    mResultList.setAdapter(firebaseRecyclerAdapter);

}


// View Holder Class

public static class UsersViewHolder extends RecyclerView.ViewHolder {

    View mView;

    public UsersViewHolder(View itemView) {
        super(itemView);
        mView = itemView;

    }

    public void setDetails(String name, String surname) {

        TextView user_name = (TextView) mView.findViewById(R.id.name_text);
        TextView user_surname = (TextView) mView.findViewById(R.id.status_text);

        user_name.setText(name);
        user_surname.setText(surname);


    }

}

}

在此处输入代码

数据库:

我遇到的问题:

W/PersistentConnection: pc_0 - Using an unspecified index. Your data will be downloaded and filtered             
on the client. Consider adding '".indexOn": "Name"' at Users to your security and Firebase Database     
rules for better performance
W/ClassMapper: No setter/field for Surname found on class com.example.ipill.Users (fields/setters are 
case sensitive!)
W/ClassMapper: No setter/field for Name found on class com.example.ipill.Users (fields/setters are 
case sensitive!)
W/m.example.ipil: Accessing hidden field Landroid/view/View;- 
>mAccessibilityDelegate:Landroid/view/View$AccessibilityDelegate; (greylist, reflection, allowed)

模型类

package com.example.ipill;

public class Users {

public String name, surname;


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


public String getSurname() {
    return surname;
}


public void setSurname(String surname) {
    this.surname = surname;
}


public Users(String name, String surname, String status) {
    this.name = name;
    this.surname = surname;

}

public Users(){

}

} 

在此处输入代码

【问题讨论】:

  • 输出中有多个错误消息,每个错误消息在之前的多个问题中都已涵盖。你已经搜索过那些了吗?您从这些问题的答案中学到了什么,这些问题可能导致您共享的代码出现问题?
  • 使用未指定的索引错误 -> 我尝试通过将 .indexOf : Name 添加到 DATABASE 的规则来修复它,但它并没有改变任何我得到相同错误的东西。在类错误中找不到姓氏的设置器/字段->我在 StackOverflow 上找到了修复程序,但它不适用于我想做的事情。所以我没有其他可以尝试的东西,所以我寻求帮助,因为我尝试了几乎一整天的时间来解决问题。
  • 如果你仍然得到同样的错误,你没有正确定义索引。在没有看到重现问题的最小规则的情况下,我们无话可说。另请注意,这些错误中的每一个都是一个单独的问题。在一个问题中包含多个问题会使帮助变得更加困难,因此不太可能有人会提供帮助。
  • 我添加了我的数据库的规则,我在添加索引时遵循了网站上的文档,希望我没有错过任何东西。

标签: android firebase firebase-realtime-database


【解决方案1】:

错误消息非常明确地说明了您需要做什么:

考虑在用户处添加 '".indexOn": "Name"'

所以您需要在规则中的Users 节点处添加".indexOn": "Name"

所以:

{
  "rules": {
    "Users": {
      ".indexOn": "Name"
    }
  }
}

方括号很好["Name"],但现在你在错误的级别上定义了索引。

【讨论】:

  • 非常感谢,我错过了“用户”这一部分。现在我没有那个错误了。
【解决方案2】:

你需要创建模型类和内部getter setter

【讨论】:

  • 已经这样做了,如果你愿意,你可以检查它,我只是用模型类的代码更新帖子。提前谢谢你
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 2019-04-16
  • 2020-12-09
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多