You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio SQL预算计算器累计总额重启后重置问题求助

问题分析与解决方案

核心问题

重启APP后累计总额从零开始,本质是内存中的累计变量在重启后被清空,且新增数据时未先从数据库读取历史金额总和作为累加起点;同时加载历史数据时也未重新计算累计值,导致显示异常。

代码问题拆解

  1. totalCate_f作为内存变量,APP重启后会重置为初始值(默认0),没有从数据库读取历史所有金额的总和作为初始累加值。
  2. 加载历史数据时,直接读取数据库中旧的categoryTotal字段,未重新计算每条记录的累计总额;新增数据时也未先查询历史总和,导致重启后新记录的累计从0开始计算。

修复方案

1. 重新实现历史数据加载逻辑(计算累计总额)

修改查询数据的方法,遍历历史数据时实时计算累计总额,确保ListView显示的累计值正确:

public List<ValueModel> getValueList() {
    List<ValueModel> returnList = new ArrayList<>();
    String queryString = "SELECT * FROM " + CATEGORY_VALUE;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(queryString, null);

    float totalCate_f = 0; // 初始化累计总额为0

    if (cursor.moveToFirst()) {
        do {
            // 读取数据库字段
            String categoryDate = cursor.getString(4);
            String categoryValueStr = cursor.getString(1);
            String categoryInfo = cursor.getString(3);
            String categoryName = cursor.getString(2);

            // 累加当前金额到累计总额
            float currentValue = Float.parseFloat(categoryValueStr);
            totalCate_f += currentValue;

            // 转换为字符串存入模型
            String categoryTotal = Float.toString(totalCate_f);

            ValueModel newValue = new ValueModel(categoryDate, categoryValueStr, categoryInfo, categoryName, categoryTotal);
            returnList.add(newValue);
        } while(cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return returnList;
}

2. 修复新增数据的累计逻辑

新增数据前先查询数据库中所有历史金额的总和,再加上新金额得到正确的累计总额,存入数据库:

public void addNewValue(String date, String valueStr, String info, String name) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();

    // 查询历史金额总和
    float historyTotal = 0;
    Cursor sumCursor = db.rawQuery("SELECT SUM(" + COLUMN_VALUE + ") FROM " + CATEGORY_VALUE, null);
    if (sumCursor.moveToFirst()) {
        // 处理表为空时SUM返回null的情况
        if (!sumCursor.isNull(0)) {
            historyTotal = sumCursor.getFloat(0);
        }
    }
    sumCursor.close();

    // 计算新的累计总额
    float newValue = Float.parseFloat(valueStr);
    float newTotal = historyTotal + newValue;

    // 填充ContentValues
    cv.put(COLUMN_DATE, date);
    cv.put(COLUMN_VALUE, valueStr);
    cv.put(COLUMN_INFO, info);
    cv.put(COLUMN_NAME, name);
    cv.put(COLUMN_TOTAL, Float.toString(newTotal));

    // 插入新记录
    db.insert(CATEGORY_VALUE, null, cv);
    db.close();
}

额外建议

  • 金额处理建议用BigDecimal替代float,避免浮点精度丢失问题。
  • 如果数据库中COLUMN_TOTAL字段存储数值而非字符串,可改为REAL类型,直接存入newTotal,无需转字符串。

内容的提问来源于stack exchange,提问作者Daniel Kwon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:20:31