从 Firebase Firestore 检索时应用程序崩溃
App crashing while retrieving from Firebase Firestore
我尝试制作一个从 Firebase Firestore 获取数据的 RecyclerView,但它崩溃了。
Adapter 没有错误,因为当我手动将数据添加到 ArrayList 时它工作正常,我注释了这些行。
我从代码中排除了导入标签,一切都很好。
我还仔细检查了 Firestore 和我的代码中的集合名称,它匹配。
这是我的代码:
public class MainActivity extends AppCompatActivity {
RecyclerView items;
ArrayList<Item> itemsList;
MyAdapter adapter;
FirebaseFirestore db;
ProgressDialog pD;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pD = new ProgressDialog(this);
pD.setCancelable(false);
pD.setMessage("Retrieving Data...");
pD.show();
items = findViewById(R.id.recycle);
items.setHasFixedSize(true);
items.setLayoutManager(new LinearLayoutManager(this));
db = FirebaseFirestore.getInstance();
itemsList = new ArrayList<Item>();
adapter = new MyAdapter(MainActivity.this, itemsList);
items.setAdapter(adapter);
itemsList.add(new Item("Test", "Test")); //This is test line to see if error is in Adapter.
EventChangeListener();
}
private void EventChangeListener() {
db.collection("Foods")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if (error != null){
Toast.makeText(MainActivity.this, "Database Error " + error.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
for (DocumentChange dc : value.getDocumentChanges()){
if(dc.getType() == DocumentChange.Type.ADDED){
itemsList.add(dc.getDocument().toObject(Item.class)); //When I comment this line it works fine
//and if I add items to list manually like shown above it works fine
}
adapter.notifyDataSetChanged();
}
}
});
}
}
我没有收到任何错误,它只是崩溃了。
编辑 1:
我查看了与 Logcat 相关的另一篇文章,每篇文章似乎都只是放了 Exception:
2021-10-28 10:50:30.801 3159-3159/com.example.recyclerview E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.recyclerview, PID: 3159
java.lang.RuntimeException: Found two getters or fields with conflicting case sensitivity for property: name
at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.addProperty(CustomClassMapper.java:736)
at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.<init>(CustomClassMapper.java:640)
at com.google.firebase.firestore.util.CustomClassMapper.loadOrCreateBeanMapperForClass(CustomClassMapper.java:377)
at com.google.firebase.firestore.util.CustomClassMapper.convertBean(CustomClassMapper.java:540)
at com.google.firebase.firestore.util.CustomClassMapper.deserializeToClass(CustomClassMapper.java:253)
at com.google.firebase.firestore.util.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:100)
at com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:183)
at com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:116)
at com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:161)
at com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:97)
at com.example.recyclerview.MainActivity.onEvent(MainActivity.java:75)
at com.example.recyclerview.MainActivity.onEvent(MainActivity.java:61)
at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$com-google-firebase-firestore-Query(Query.java:1133)
at com.google.firebase.firestore.Query$$ExternalSyntheticLambda2.onEvent(Unknown Source:6)
at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent[=11=]$com-google-firebase-firestore-core-AsyncEventListener(AsyncEventListener.java:42)
at com.google.firebase.firestore.core.AsyncEventListener$$ExternalSyntheticLambda0.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8595)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
这里还有 Firebase Firestore 的截图:
数据是我的第一语言,不是英语,也是占位符。
第 61 行是 .addSnapshotListener(new EventListener<QuerySnapshot>() {
第 75 行是 itemsList.add(dc.getDocument().toObject(Item.class));
我找到了解决办法。
首先我没有在项目class中创建一个空的构造函数。
package com.example.recyclerview;
import android.widget.ImageView;
public class Item {
protected String Name;
protected String Type;
private int photo;
public Item(String name, String type) {
Name = name;
Type = type;
this.photo = R.drawable.ic_launcher_background;
}
//I added this
public Item(){
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getType() {
return Type;
}
public void setType(String type) {
Type = type;
}
public int getPhoto() {
return photo;
}
public void setPhoto(int photo) {
this.photo = photo;
}
}
行已注释。
我在 this Stack post.
上找到了这个答案
在那之后,我得到了空的 Cardview 布局,因为我没有将 Firestore 名称与项目 class 中的名称相匹配。
希望我也能帮到别人。
我尝试制作一个从 Firebase Firestore 获取数据的 RecyclerView,但它崩溃了。
Adapter 没有错误,因为当我手动将数据添加到 ArrayList 时它工作正常,我注释了这些行。
我从代码中排除了导入标签,一切都很好。 我还仔细检查了 Firestore 和我的代码中的集合名称,它匹配。
这是我的代码:
public class MainActivity extends AppCompatActivity {
RecyclerView items;
ArrayList<Item> itemsList;
MyAdapter adapter;
FirebaseFirestore db;
ProgressDialog pD;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pD = new ProgressDialog(this);
pD.setCancelable(false);
pD.setMessage("Retrieving Data...");
pD.show();
items = findViewById(R.id.recycle);
items.setHasFixedSize(true);
items.setLayoutManager(new LinearLayoutManager(this));
db = FirebaseFirestore.getInstance();
itemsList = new ArrayList<Item>();
adapter = new MyAdapter(MainActivity.this, itemsList);
items.setAdapter(adapter);
itemsList.add(new Item("Test", "Test")); //This is test line to see if error is in Adapter.
EventChangeListener();
}
private void EventChangeListener() {
db.collection("Foods")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if (error != null){
Toast.makeText(MainActivity.this, "Database Error " + error.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
for (DocumentChange dc : value.getDocumentChanges()){
if(dc.getType() == DocumentChange.Type.ADDED){
itemsList.add(dc.getDocument().toObject(Item.class)); //When I comment this line it works fine
//and if I add items to list manually like shown above it works fine
}
adapter.notifyDataSetChanged();
}
}
});
}
}
我没有收到任何错误,它只是崩溃了。
编辑 1:
我查看了与 Logcat 相关的另一篇文章,每篇文章似乎都只是放了 Exception:
2021-10-28 10:50:30.801 3159-3159/com.example.recyclerview E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.recyclerview, PID: 3159
java.lang.RuntimeException: Found two getters or fields with conflicting case sensitivity for property: name
at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.addProperty(CustomClassMapper.java:736)
at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.<init>(CustomClassMapper.java:640)
at com.google.firebase.firestore.util.CustomClassMapper.loadOrCreateBeanMapperForClass(CustomClassMapper.java:377)
at com.google.firebase.firestore.util.CustomClassMapper.convertBean(CustomClassMapper.java:540)
at com.google.firebase.firestore.util.CustomClassMapper.deserializeToClass(CustomClassMapper.java:253)
at com.google.firebase.firestore.util.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:100)
at com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:183)
at com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:116)
at com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:161)
at com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:97)
at com.example.recyclerview.MainActivity.onEvent(MainActivity.java:75)
at com.example.recyclerview.MainActivity.onEvent(MainActivity.java:61)
at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$com-google-firebase-firestore-Query(Query.java:1133)
at com.google.firebase.firestore.Query$$ExternalSyntheticLambda2.onEvent(Unknown Source:6)
at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent[=11=]$com-google-firebase-firestore-core-AsyncEventListener(AsyncEventListener.java:42)
at com.google.firebase.firestore.core.AsyncEventListener$$ExternalSyntheticLambda0.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8595)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
这里还有 Firebase Firestore 的截图:
数据是我的第一语言,不是英语,也是占位符。
第 61 行是 .addSnapshotListener(new EventListener<QuerySnapshot>() {
第 75 行是 itemsList.add(dc.getDocument().toObject(Item.class));
我找到了解决办法。
首先我没有在项目class中创建一个空的构造函数。
package com.example.recyclerview;
import android.widget.ImageView;
public class Item {
protected String Name;
protected String Type;
private int photo;
public Item(String name, String type) {
Name = name;
Type = type;
this.photo = R.drawable.ic_launcher_background;
}
//I added this
public Item(){
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getType() {
return Type;
}
public void setType(String type) {
Type = type;
}
public int getPhoto() {
return photo;
}
public void setPhoto(int photo) {
this.photo = photo;
}
}
行已注释。 我在 this Stack post.
上找到了这个答案在那之后,我得到了空的 Cardview 布局,因为我没有将 Firestore 名称与项目 class 中的名称相匹配。
希望我也能帮到别人。