Stackoverflowerror при отправке объекта в базу данных firebase realtime

База данных Firebase Realtime аварийно завершает работу java.lang.StackOverflowError: stack size 8MB, когда я пытаюсь отправить объект BankAccount. Я уже заменил все объектные переменные на Strings и исключил метод getSubcategoryByName, но ничего из этого не помогло.

private long amount;
private String description;
private String subcategoryName, primaryCategoryName;
private long creationDate;
private int type;

private boolean autoPayBill;

public Bill(){ }

public Bill(long amount, String description, String subcategoryName, String primaryCategoryName, int type, boolean autoPayBill, long creationDate) {
    this.amount = amount;
    this.description = description;
    this.subcategoryName = subcategoryName;
    this.primaryCategoryName = primaryCategoryName;
    this.creationDate = creationDate;
    this.autoPayBill = autoPayBill;
    this.type = type;
}

public Bill(long amount, String description, int type, boolean autoPayBill, String subcategoryName, String primaryCategoryName) {
    this.amount = amount;
    this.description = description;
    this.subcategoryName = subcategoryName;
    this.primaryCategoryName = primaryCategoryName;
    this.type = type;
    this.autoPayBill = autoPayBill;
    creationDate = System.currentTimeMillis();
}

public long getAmount() {
    return amount;
}

public void setAmount(long amount) {
    this.amount = amount;
}

public boolean isAutoPayBill() {
    return autoPayBill;
}

public void setAutoPayBill(boolean autoPayBill) {
    this.autoPayBill = autoPayBill;
}

public String getDescription() {
    return description;
}

public void setDescription(String descriptions) {
    this.description = descriptions;
}

public Subcategory getSubcategory() {
    return getSubcategoryByName();
}

public void setSubcategory(Subcategory subcategory) {
    this.subcategoryName = subcategory.getName();
}

public String getSubcategoryName() {
    return subcategoryName;
}

public void setSubcategoryName(String subcategoryName) {
    this.subcategoryName = subcategoryName;
}

public String getPrimaryCategoryName() {
    return primaryCategoryName;
}

public void setPrimaryCategoryName(String primaryCategoryName) {
    this.primaryCategoryName = primaryCategoryName;
}

public long getCreationDate() {
    return creationDate;
}

public void setCreationDate(long creationDate) {
    this.creationDate = creationDate;
}

public int getType() {
    return type;
}

public void setType(int type) {
    this.type = type;
}

@Exclude
private Subcategory getSubcategoryByName(){
    for (PrimaryCategory primaryCategory:Database.getPrimaryCategories()){
        if (primaryCategory.getName().equals(primaryCategoryName)){
            for (Subcategory subcategory:primaryCategory.getSubcategories()){
                if (subcategory.getName().equals(subcategoryName)){
                    return subcategory;
                }
            }
        }
    }

    throw new IllegalArgumentException("Couldn't find subcategory by name!");
}

}

Это класс BankAccount, у которого есть переменная ArrayList, которая содержит все Bills.

public class BankAccount {

private String name;

private long balance; //In cents

private ArrayList<Bill> bills;

private boolean primaryAccount;

private long creationDate;

private ArrayList<BalanceChange> balanceChanges;

public BankAccount(){

}

public BankAccount(String name, long balance, boolean primaryAccount, long creationDate) {
    this.name = name;
    this.balance = balance;
    this.primaryAccount = primaryAccount;
    this.creationDate = creationDate;
    bills = new ArrayList<>();
    balanceChanges = new ArrayList<>();
}

public BankAccount(String name, long balance, boolean primaryAccount) {
    this.name = name;
    this.balance = balance;
    this.primaryAccount = primaryAccount;
    creationDate = System.currentTimeMillis();
    bills = new ArrayList<>();
    balanceChanges = new ArrayList<>();
}

public String getName() {
    return name;
}

public void addBill(Bill bill) {
    if (bill.getType() == Bill.TYPE_INPUT){
        setBalance(getBalance() + bill.getAmount());
} else if(bill.getType() == Bill.TYPE_OUTPUT){
        setBalance(getBalance() - bill.getAmount());
    }

    bills.add(bill);
    balanceChanges.add(new BalanceChange(System.currentTimeMillis(), this.getBalance()));

}

public void setName(String name) {
    this.name = name;
}

public long getBalance() {
    return balance;
}

public void setBalance(long balance) {
    this.balance = balance;
}

public ArrayList<Bill> getBills() {
    return bills;
}

public void setBills(ArrayList<Bill> bills) {
    this.bills = bills;
}

public boolean isPrimaryAccount() {
    return primaryAccount;
}

public void setPrimaryAccount(boolean primaryAccount) {
    this.primaryAccount = primaryAccount;
}

public long getCreationDate() {
    return creationDate;
}

public void setCreationDate(long creationDate) {
    this.creationDate = creationDate;
}

public ArrayList<BalanceChange> getBalanceChanges() {
    return balanceChanges;
}

public void setBalanceChanges(ArrayList<BalanceChange> balanceChanges) {
    this.balanceChanges = balanceChanges;
}

}

И как объекты помещаются в Firebase

    public void createServerBackup(ArrayList<BankAccount> bankAccounts){
        DatabaseReference bankAccountsReference = userReference.child(BANK_ACCOUNTS_REFERENCE);
        bankAccountsReference.setValue(bankAccounts);
}

Я думаю, у вас где-то бесконечный цикл ссылок. Разместите объект BankAccount и как его сохранить.

nikis 10.08.2018 16:26

@nikis вот как я сохраняю public void createServerBackup(ArrayList<BankAccount> bankAccounts){ DatabaseReference bankAccountsReference = userReference.child(BANK_ACCOUNTS_REFERENCE); bankAccountsReference.setValue(bankAccounts); }

eli2003 10.08.2018 16:29

Отредактируйте свой вопрос, добавив код, который вы используете для добавления bankAccounts в базу данных, а также ответьте с помощью @.

Alex Mamo 10.08.2018 16:37

@niks Я отредактировал свой вопрос

eli2003 10.08.2018 16:50

Очевидный вопрос: насколько велики именно данные, которые вы пытаетесь сохранить?

André Kool 10.08.2018 16:56

На данный момент это один объект BankAccount, который содержит один Bill

eli2003 10.08.2018 16:57
0
6
48
0

Другие вопросы по теме