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

技术问询:如何获取按钮点击数据存入数据库及实现计算结果存储与图表生成

嘿,针对你的两个问题,结合你给出的代码片段,我整理了详细的解决方案,一步步来:

1. 获取按钮点击事件并将数据存入数据库

首先我们需要给计算按钮绑定点击监听,在点击时调用doCalories方法获取结果,再把结果和日期一起存入数据库:

步骤1:绑定按钮点击监听并处理数据

在你的Activity的onCreate方法中添加以下代码:

// 替换成你实际的按钮ID
Button calculateBtn = findViewById(R.id.calculate_calories_btn);
calculateBtn.setOnClickListener(v -> {
    // 从UI控件获取输入参数(示例,替换成你实际的控件ID)
    boolean fem = findViewById(R.id.female_checkbox).isChecked();
    boolean male = findViewById(R.id.male_checkbox).isChecked();
    double age = Double.parseDouble(((EditText) findViewById(R.id.age_input)).getText().toString());
    double weight = Double.parseDouble(((EditText) findViewById(R.id.weight_input)).getText().toString());
    double feet = Double.parseDouble(((EditText) findViewById(R.id.feet_input)).getText().toString());
    double inches = Double.parseDouble(((EditText) findViewById(R.id.inches_input)).getText().toString());
    
    // 调用doCalories获取计算结果
    double caloriesResult = doCalories(fem, male, age, weight, feet, inches);
    // 获取当前日期时间(复用你原代码的逻辑)
    String currentDateTime = getCurrentDateTime();
    
    // 将结果存入数据库
    saveCaloriesRecord(caloriesResult, currentDateTime);
});

步骤2:封装日期获取方法

把你原代码中的日期逻辑抽成独立方法,方便复用:

private String getCurrentDateTime() {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.getDefault());
    return sdf.format(calendar.getTime());
}

步骤3:实现数据库操作(以原生SQLite为例)

先创建数据库帮助类,用来管理user-registration.db的创建和数据增删查改:

public class CaloriesDbHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "user-registration.db";
    private static final int DB_VERSION = 1;
    
    // 卡路里记录表结构
    private static final String TABLE_CALORIES = "calories_records";
    private static final String COLUMN_ID = "_id";
    private static final String COLUMN_CALORIES = "calories_value";
    private static final String COLUMN_DATE = "record_date";

    public CaloriesDbHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建记录表的SQL语句
        String createTableSql = "CREATE TABLE " + TABLE_CALORIES + " (" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_CALORIES + " DOUBLE NOT NULL, " +
                COLUMN_DATE + " TEXT NOT NULL)";
        db.execSQL(createTableSql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 升级时先删除旧表(生产环境建议做数据迁移,避免丢失数据)
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CALORIES);
        onCreate(db);
    }

    // 插入卡路里记录的方法
    public void insertCalories(double calories, String dateTime) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_CALORIES, calories);
        values.put(COLUMN_DATE, dateTime);
        db.insert(TABLE_CALORIES, null, values);
        db.close();
    }
}

然后在Activity中实现保存数据的方法:

private void saveCaloriesRecord(double calories, String dateTime) {
    CaloriesDbHelper dbHelper = new CaloriesDbHelper(this);
    dbHelper.insertCalories(calories, dateTime);
}
2. 基于数据库数据生成图表

我们可以用Android常用的图表库MPAndroidChart来实现(如果你用其他库,逻辑类似):

步骤1:添加图表库依赖

在你的app/build.gradle中添加依赖:

dependencies {
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
}

步骤2:在布局中添加图表控件

<com.github.mikephil.charting.charts.LineChart
    android:id="@+id/calories_line_chart"
    android:layout_width="match_parent"
    android:layout_height="350dp"
    android:layout_margin="16dp"/>

步骤3:从数据库读取数据并配置图表

首先给CaloriesDbHelper添加查询所有记录的方法:

// 查询所有卡路里记录
public List<CaloriesRecord> getAllCaloriesRecords() {
    List<CaloriesRecord> records = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CALORIES + " ORDER BY " + COLUMN_DATE + " ASC", null);
    
    if (cursor.moveToFirst()) {
        do {
            double calories = cursor.getDouble(cursor.getColumnIndexOrThrow(COLUMN_CALORIES));
            String date = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DATE));
            records.add(new CaloriesRecord(calories, date));
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return records;
}

// 配套的实体类,用来存储单条记录
public static class CaloriesRecord {
    private double calories;
    private String dateTime;

    public CaloriesRecord(double calories, String dateTime) {
        this.calories = calories;
        this.dateTime = dateTime;
    }

    public double getCalories() { return calories; }
    public String getDateTime() { return dateTime; }
}

然后在Activity中实现图表初始化方法:

private void setupCaloriesChart() {
    LineChart lineChart = findViewById(R.id.calories_line_chart);
    CaloriesDbHelper dbHelper = new CaloriesDbHelper(this);
    List<CaloriesDbHelper.CaloriesRecord> records = dbHelper.getAllCaloriesRecords();
    
    // 准备图表数据
    ArrayList<Entry> chartEntries = new ArrayList<>();
    ArrayList<String> dateLabels = new ArrayList<>();
    
    for (int i = 0; i < records.size(); i++) {
        CaloriesDbHelper.CaloriesRecord record = records.get(i);
        chartEntries.add(new Entry(i, (float) record.getCalories()));
        dateLabels.add(record.getDateTime());
    }
    
    // 配置数据集样式
    LineDataSet dataSet = new LineDataSet(chartEntries, "卡路里计算历史");
    dataSet.setColor(Color.parseColor("#2196F3"));
    dataSet.setCircleColor(Color.parseColor("#1976D2"));
    dataSet.setValueTextColor(Color.BLACK);
    
    // 绑定数据到图表
    LineData lineData = new LineData(dataSet);
    lineChart.setData(lineData);
    
    // 优化图表显示
    lineChart.getDescription().setEnabled(false);
    lineChart.getXAxis().setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value) {
            return dateLabels.get((int) value);
        }
    });
    lineChart.getAxisLeft().setDrawGridLines(false);
    lineChart.animateXY(1000, 1000); // 添加入场动画
    lineChart.invalidate(); // 刷新图表
}

最后,你可以在数据保存完成后或者Activity启动时调用setupCaloriesChart()来刷新图表,比如在saveCaloriesRecord方法末尾添加调用,或者在onResume中调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:26:34