技术问询:如何获取按钮点击数据存入数据库及实现计算结果存储与图表生成
嘿,针对你的两个问题,结合你给出的代码片段,我整理了详细的解决方案,一步步来:
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
相关产品推荐
相关产品推荐

