将对象推送到Firebase实时数据库时出现StackOverflowError

时间:2018-08-10 14:21:16

标签: java android firebase firebase-realtime-database

当我尝试推送java.lang.StackOverflowError: stack size 8MB对象时,Firebase Realtime Database崩溃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

公共类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);
}

0 个答案:

没有答案