当我尝试推送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);
}