簡體   English   中英

在我的 Android 項目上使用 setValue() 方法時 Firebase 出現 StackOverflow 錯誤

[英]StackOverflow error with Firebase, while using setValue() method on my Android Project

我存儲用戶參加和創建的每個事件。 我想,存儲在 User 中的列表在使用 .setValue(user) 時會導致 StackOverflow 錯誤。

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) 。 但是,一旦我將事件添加到用戶的參加事件中,我就會收到 StackOverflow 錯誤。

    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); // StackOverflow
}

錯誤消息是:

java.lang.StackOverflowError: 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)
    ...

我該如何解決這個問題?

我的 Event 類,排除了 getter 和 setter。

公共類事件{

//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); // StackOverflow

                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

[解決了]

我意識到我正在嘗試將用戶存儲在事件的 user_list 中,並且所有用戶都有參與列表,它也使用 user_list 存儲事件。 因此,存在列表的遞歸分支。 然后,這會導致 android studio 拋出 stackoverflow 錯誤。

我希望您的Event類包含一個User屬性,然后不僅添加用戶,還添加該用戶的事件。 由於用戶所在的事件也意味着用戶在該事件中,因此您有一個無限循環。 因為事件添加了用戶,誰又添加了事件,又依次添加了用戶,又添加了事件,...直到堆棧溢出。

為了防止堆棧溢出,要么刪除事件中用戶的嵌套,要么刪除用戶中的事件,或者不要通過使用@Exclude注釋將其寫入數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM