2016-08-24 106 views
1

所以我有一個用戶類。而用戶類有一個叫做追隨者的用戶列表列表。當我嘗試上傳一個用戶對象(在這個用戶對象的追隨者arraylist中的一些用戶)Firebase無法做到這一點,我的程序崩潰...我無法計算如何存儲和檢索我自己的對象其中有其他自定義對象。如何在Android的Firebase中存儲和檢索對象?

所以主要錯誤我得到的是:

無法啓動活動ComponentInfo {com.daprlabs.swipedeck/com.daprlabs.swipedeck.ActivityCenter}:com.firebase.client.FirebaseException:解析失敗到快照

這是我的java代碼。

編輯:添加@exclude,但仍然無法正常工作......

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mRef = new Firebase("Fire base reference..."); 
     dummyUser(); 
    } 

    private void dummyUser() 
    { 
     //Andie <- Chris <- Qamar 
     mainDummyUser = new User(); 
     mainDummyUser.setName("Chris"); 
     mainDummyUser.setLocation("Deutchland"); 
     mainDummyUser.setDummyImage(R.drawable.chris); 
     //Second Dummy 
     User secondDummy = new User(); 
     secondDummy.setName("Andie"); 
     secondDummy.setLocation("Germany"); 
     secondDummy.setDummyImage(R.drawable.andie); 
     secondDummy.addtoFollowers(mainDummyUser); 

     mainDummyUser.addtoFollowers(secondDummy); 

     //Add users to Firebase 
     mRef.child("users").child("Dummy User 1").setValue(mainDummyUser); 


    } 

這裏是我的用戶類,非常簡單。

public class User 
{ 
    private String userName; 
    private int userID; 
    private String userEmail; 
    private String userProfilePicture; 
    private ArrayList<CityFolders> userFolders = new ArrayList<>(); 

    //Constructor 
    public User() 
    { 
     setDummyUserID(); 
    } 
    public void addtoFollowers(User user) 
    { 
     userFollowers.add(user); 
    } 
    public void setLocation(String location) 
    { 
     this.location = location; 
    } 
    public void setDummyImage(int image) 
    { 
     this.dummyImage = image; 
    } 

    public void setDummyUserID() 
    { 
     Random randomNumberGenerator = new Random(); 
     userID = randomNumberGenerator.nextInt(1000000); 
    } 
    //Getter 
    public String getUserName() 
    { 
     return userName; 
    } 


    public String getLocation() 
    { 
     return location; 
    } 
    public int getUserID() 
    { 
     return userID; 
    } 
    @Exclude 
    public ArrayList<UserFinal> getUserFollowers() 
    { 
     return userFollowers; 
    } 
    //Goes on... 
} 

這裏是我的堆棧跟蹤:

08-24 19:07:26.549 23384-23384/com.daprlabs.swipedeck E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.daprlabs.swipedeck, PID: 23384 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.daprlabs.swipedeck/com.daprlabs.swipedeck.ActivityCenter}: com.firebase.client.FirebaseException: Failed to parse to snapshot 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494) 
                      at android.app.ActivityThread.access$900(ActivityThread.java:157) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5525) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
                     Caused by: com.firebase.client.FirebaseException: Failed to parse to snapshot 
                      at com.firebase.client.Firebase.setValueInternal(Firebase.java:357) 
                      at com.firebase.client.Firebase.setValue(Firebase.java:248) 
                      at com.daprlabs.swipedeck.ActivityCenter.dummyUser(ActivityCenter.java:165) 
                      at com.daprlabs.swipedeck.ActivityCenter.onCreate(ActivityCenter.java:122) 
                      at android.app.Activity.performCreate(Activity.java:6272) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)  
                      at android.app.ActivityThread.access$900(ActivityThread.java:157)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:148)  
                      at android.app.ActivityThread.main(ActivityThread.java:5525)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)  
                     Caused by: java.lang.IllegalArgumentException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowing"]->java.util.ArrayList[0]->com.daprlabs.swipedeck.Globals.User["userFollowers"]->java.util.Arra 
08-24 19:07:26.577 23384-23394/com.daprlabs.swipedeck W/art: Suspending all threads took: 32.173ms 
+0

你需要從追隨者返回鏈接給跟隨的用戶?由於錯誤信息表明這會創建無限的對象鏈...... – marsbear

+0

不,因爲每個用戶也有一個名爲userFollowing的數組列表。因此,追隨者將各自擁有自己的arrayList,稱爲「userFollowing」,在這種情況下,對於每個追隨者,他們的下一個用戶數組將具有mainDummyUser –

+0

然後只需刪除後鏈接:)或者排除像我在回答。 – marsbear

回答

0

嘗試增加@ExcludeuserFollowing屬性的getter方法。這應該打破無限循環問題。

@Exclude 
public User getUserFollowing() 

如果你總是以這種方式更新用戶(有一個用戶和他的追隨者),這將起作用。如果您想直接更新作爲追隨者的用戶,可能會出現問題。

+0

所以我試過了。我把它放在getUserFollowing中,而其他任何地方它都不起作用。經過認真的測試後,我意識到我不能把mainDummyUser放在secondDummy的FollowersArray中,然後在mainDummy的followers數組中放置secondDummy。一個對象不能擁有自己。而且我不能爲我的生活修復它...... –

+0

如果即使您將@Exclude放在getter中,您仍然得到相同的錯誤,那麼其他錯誤也是如此。您在Android上使用哪個版本的Firebase? – marsbear

+0

這是當前Firebase版本:編譯'com.google.firebase:firebase-auth:9.0。1' –

1

如何使用不是用戶而是用戶ID? 像

private void dummyUser() 
    { 
     mainDummyUser = new User(); 
     mainDummyUser.setName("Chris"); 
     mainDummyUser.setLocation("Deutchland"); 

     User secondDummy = new User(); 
     secondDummy.setName("Andie"); 
     secondDummy.setLocation("Germany"); 

     secondDummy.addFollowerUserIDs(mainDummyUser.getUserID()); 
     mainDummyUser.addFollowerUserIDs(secondDummy.getUserID()); 
     //Add users to Firebase 
     mRef.child("users").child(mainDummyUser.getUserID()).setValue(mainDummyUser); 
     mRef.child("users").child(secondDummy.getUserID()).setValue(secondDummy); 
    } 

public class User { 

    private String userName; 
    private String location; 
    private String userID; 
    private ArrayList<String> FollowerUserIDs = new ArrayList<>(); 

    //Constructor 
    @SuppressWarnings("unused") 
    public User() 
    { 
     setDummyUserID(); 
    } 
    public void addFollowerUserIDs(String userID) 
    { 
     FollowerUserIDs.add(userID); 
    } 

    public void setLocation(String location) 
    { 
     this.location = location; 
    } 
    public void setDummyImage(int image) 
    { 
    // this.dummyImage = image; 
    } 

    public void setDummyUserID() 
    { 
     Random randomNumberGenerator = new Random(); 
     userID = String.valueOf(randomNumberGenerator.nextInt(1000000)); 
    } 

    public void setUserID() 
    { 
     Random randomNumberGenerator = new Random(); 
     userID = String.valueOf(randomNumberGenerator.nextInt(1000000)); 
    } 
    //Getter 
    public String getUserName() 
    { 
     return userName; 
    } 
    public void setName(String userName) 
    { 
     this.userName = userName; 
    } 


    public String getLocation() 
    { 
     return location; 
    } 
    public String getUserID() 
    { 
     return userID; 
    } 

    public ArrayList<String> getFollowerUserIDs() 
    { 
     return FollowerUserIDs; 
    } 
} 

另外,你的代碼示例是

public class User 
{ 
    private String userName; 
    private int userID; 
    private String userEmail; 
    private String userProfilePicture; 
    private ArrayList<CityFolders> userFolders = new ArrayList<>();. 

,但它應該是

public class User 
{ 
    private String userName; 
    private int userID; 
    private String userEmail; 
    private String userProfilePicture; 
    private ArrayList<User> userFollowers = new ArrayList<>(); 
+0

@Seriyo謝謝Seiryo。我也使用userId來實現。它的工作原理。因此,不是直接查詢用戶,我可以做的是直接對該用戶ID進行Firebase引用,並像這樣獲取它:'Firebase referenceToUser2 = mRef.child(String.valueOf(getUserID)); ' –

相關問題