Android Studio SQL预算计算器累计总额重启后重置问题求助
问题分析与解决方案
核心问题
重启APP后累计总额从零开始,本质是内存中的累计变量在重启后被清空,且新增数据时未先从数据库读取历史金额总和作为累加起点;同时加载历史数据时也未重新计算累计值,导致显示异常。
代码问题拆解
totalCate_f作为内存变量,APP重启后会重置为初始值(默认0),没有从数据库读取历史所有金额的总和作为初始累加值。- 加载历史数据时,直接读取数据库中旧的
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
相关产品推荐
相关产品推荐

