在我的 Android 项目上使用 setValue() 方法时,Firebase 出现 StackOverflow 错误
StackOverflow error with Firebase, while using setValue() method on my Android Project
我存储用户参加和创建的每个事件。我想,存储在 User 中的列表在使用 .setValue(user) 时会导致 Whosebug 错误。
public class User {
//Field
private String name;
private String email;
private List<Event> attending_events = new ArrayList<Event>();
private List<Event> created_events = new ArrayList<Event>();
}
没有用户参加任何活动,他们的列表是空的,我可以毫无问题地使用 .setValue(user)。但是,一旦我将事件添加到用户的 attending_events,我就会收到 Whosebug 错误。
public boolean joinEvent(){
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference events = database.getReference().child( "events");
DatabaseReference users = database.getReference().child( "users");
String type = event.getType();
DatabaseReference event_type = events.child( type);
event.setNumberOfCurrentParticipants(event.getNumberOfCurrentParticipants() ++);
event.setRateOfParticipants();
event.add( user);
FirebaseClass.updateEvent( event_type, event);
user.getAttending_events().add( event);
users.child(user.getName()).setValue( user); // Whosebug
}
错误信息是:
java.lang.WhosebugError: stack size 8MB
at java.lang.reflect.Method.invoke(Native Method)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:58)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:237)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:191)
at com.google.android.gms.internal.firebase_database.zzkt.zzl(Unknown Source:0)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:120)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:237)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:191)
at com.google.android.gms.internal.firebase_database.zzkt.zzl(Unknown Source:0)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:120)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:237)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:191)
at com.google.android.gms.internal.firebase_database.zzkt.zzl(Unknown Source:0)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:120)
...
我该如何解决?
我的事件class,排除了 getter 和 setter。
public class 事件 {
//Properties
private String title;
private String place;
private String date;
private String deadline;
private int numberOfCurrentParticipants;
private int numberOfParticipants;
private String description;
private String type;
private String userName;
private double rateOfParticipants;
private ArrayList<User> user_list;
private String key;
/**
* Empty Constructor
*/
public Event(){
user_list = new ArrayList<User>();
}
public Event( String title, String place, String date, String deadline, int numberOfParticipants, String description, String userName) {
this.title = title;
this.place = place;
this.date = date;
this.deadline = deadline;
this.numberOfParticipants = numberOfParticipants;
this.description = description;
this.userName = userName;
numberOfCurrentParticipants = 1;
type = null;
setRateOfParticipants();
user_list = new ArrayList<User>();
}
public void add( User user)
{
user_list.add( user);
}
public void remove( User user)
{
int index = -1;
for(int i = 0; i < user_list.size(); i ++)
{
if( user_list.get( i).equals( user))
index = i;
}
user_list.remove( index);
}
还有我的 FirebaseClass.updateEvent() 方法。 (这也会给出计算器错误):
public static void updateEvent( final DatabaseReference ref, final Event event)
{
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> events = dataSnapshot.getChildren();
for(DataSnapshot snapshot : events){
Event temp = snapshot.getValue(Event.class);
if(temp.getTitle().equals(event.getTitle()) && temp.getDescription().equals(event.getDescription())) {
snapshot.getRef().setValue(event); // Whosebug
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
[已解决]
我意识到我试图将用户存储在事件的 user_list 中,并且所有用户都有 attending_list,它也存储带有 user_list 的事件。因此,存在列表的递归分支。然后,这会导致 android studio 抛出 Whosebug 错误。
我希望您的 Event
class 包含 User
属性,然后它不仅会添加用户,还会添加该用户的事件。由于用户正在参加的活动也意味着用户正在参加该活动,因此您有一个无限循环。因为事件添加了用户,用户又添加了事件,用户又添加了用户,用户又添加了事件,...直到堆栈溢出。
为防止堆栈溢出,要么删除用户在事件中的嵌套,要么删除用户中的事件,或者不要通过使用@Exclude
注释将其写入数据库。
我存储用户参加和创建的每个事件。我想,存储在 User 中的列表在使用 .setValue(user) 时会导致 Whosebug 错误。
public class User {
//Field
private String name;
private String email;
private List<Event> attending_events = new ArrayList<Event>();
private List<Event> created_events = new ArrayList<Event>();
}
没有用户参加任何活动,他们的列表是空的,我可以毫无问题地使用 .setValue(user)。但是,一旦我将事件添加到用户的 attending_events,我就会收到 Whosebug 错误。
public boolean joinEvent(){
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference events = database.getReference().child( "events");
DatabaseReference users = database.getReference().child( "users");
String type = event.getType();
DatabaseReference event_type = events.child( type);
event.setNumberOfCurrentParticipants(event.getNumberOfCurrentParticipants() ++);
event.setRateOfParticipants();
event.add( user);
FirebaseClass.updateEvent( event_type, event);
user.getAttending_events().add( event);
users.child(user.getName()).setValue( user); // Whosebug
}
错误信息是:
java.lang.WhosebugError: stack size 8MB
at java.lang.reflect.Method.invoke(Native Method)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:58)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:237)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:191)
at com.google.android.gms.internal.firebase_database.zzkt.zzl(Unknown Source:0)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:120)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:237)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:191)
at com.google.android.gms.internal.firebase_database.zzkt.zzl(Unknown Source:0)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:120)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:237)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:191)
at com.google.android.gms.internal.firebase_database.zzkt.zzl(Unknown Source:0)
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:120)
...
我该如何解决?
我的事件class,排除了 getter 和 setter。
public class 事件 {
//Properties
private String title;
private String place;
private String date;
private String deadline;
private int numberOfCurrentParticipants;
private int numberOfParticipants;
private String description;
private String type;
private String userName;
private double rateOfParticipants;
private ArrayList<User> user_list;
private String key;
/**
* Empty Constructor
*/
public Event(){
user_list = new ArrayList<User>();
}
public Event( String title, String place, String date, String deadline, int numberOfParticipants, String description, String userName) {
this.title = title;
this.place = place;
this.date = date;
this.deadline = deadline;
this.numberOfParticipants = numberOfParticipants;
this.description = description;
this.userName = userName;
numberOfCurrentParticipants = 1;
type = null;
setRateOfParticipants();
user_list = new ArrayList<User>();
}
public void add( User user)
{
user_list.add( user);
}
public void remove( User user)
{
int index = -1;
for(int i = 0; i < user_list.size(); i ++)
{
if( user_list.get( i).equals( user))
index = i;
}
user_list.remove( index);
}
还有我的 FirebaseClass.updateEvent() 方法。 (这也会给出计算器错误):
public static void updateEvent( final DatabaseReference ref, final Event event)
{
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> events = dataSnapshot.getChildren();
for(DataSnapshot snapshot : events){
Event temp = snapshot.getValue(Event.class);
if(temp.getTitle().equals(event.getTitle()) && temp.getDescription().equals(event.getDescription())) {
snapshot.getRef().setValue(event); // Whosebug
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
[已解决]
我意识到我试图将用户存储在事件的 user_list 中,并且所有用户都有 attending_list,它也存储带有 user_list 的事件。因此,存在列表的递归分支。然后,这会导致 android studio 抛出 Whosebug 错误。
我希望您的 Event
class 包含 User
属性,然后它不仅会添加用户,还会添加该用户的事件。由于用户正在参加的活动也意味着用户正在参加该活动,因此您有一个无限循环。因为事件添加了用户,用户又添加了事件,用户又添加了用户,用户又添加了事件,...直到堆栈溢出。
为防止堆栈溢出,要么删除用户在事件中的嵌套,要么删除用户中的事件,或者不要通过使用@Exclude
注释将其写入数据库。