【发布时间】: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