master
g_miss_n 3 months ago
parent 5de5711b6f
commit eaf302dde5

@ -72,57 +72,57 @@ public class HistoryActivity extends Activity {
showStatistics();
}
private void initViews() {
listViewHistory = findViewById(R.id.listViewHistory);
textViewStats = findViewById(R.id.textViewStats);
buttonShowAll = findViewById(R.id.buttonShowAll);
buttonShowRecent = findViewById(R.id.buttonShowRecent);
buttonClearData = findViewById(R.id.buttonClearData);
buttonRefresh = findViewById(R.id.buttonRefresh);
private void initViews() { // 初始化视图组件
listViewHistory = findViewById(R.id.listViewHistory); // 获取ListView
textViewStats = findViewById(R.id.textViewStats); // 获取TextView
buttonShowAll = findViewById(R.id.buttonShowAll); // 获取Button
buttonShowRecent = findViewById(R.id.buttonShowRecent); // 获取Button
buttonClearData = findViewById(R.id.buttonClearData); // 获取Button
buttonRefresh = findViewById(R.id.buttonRefresh); // 获取Button
// 初始化筛选和查询组件
spinnerFilter = findViewById(R.id.spinnerFilter);
buttonFilter = findViewById(R.id.buttonFilter);
editStartDate = findViewById(R.id.editStartDate);
editEndDate = findViewById(R.id.editEndDate);
buttonStartDate = findViewById(R.id.buttonStartDate);
buttonEndDate = findViewById(R.id.buttonEndDate);
buttonQuery = findViewById(R.id.buttonQuery);
spinnerFilter = findViewById(R.id.spinnerFilter); // 获取Spinner
buttonFilter = findViewById(R.id.buttonFilter); // 获取Button
editStartDate = findViewById(R.id.editStartDate); // 获取EditText
editEndDate = findViewById(R.id.editEndDate); // 获取EditText
buttonStartDate = findViewById(R.id.buttonStartDate); // 获取Button
buttonEndDate = findViewById(R.id.buttonEndDate); // 获取Button
buttonQuery = findViewById(R.id.buttonQuery); // 获取Button
// 初始化ListView
displayList = new ArrayList<>();
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, displayList);
listViewHistory.setAdapter(adapter);
displayList = new ArrayList<>(); // 创建ArrayList
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, displayList); // 创建ArrayAdapter
listViewHistory.setAdapter(adapter); // 设置ListView的Adapter
// 设置筛选下拉框
setupFilterSpinner();
setupFilterSpinner(); // 设置筛选下拉框
// 设置按钮点击事件
buttonShowAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadAllData();
loadAllData(); // 加载所有数据
}
});
buttonShowRecent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadRecentData();
loadRecentData(); // 加载最近数据
}
});
buttonClearData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clearAllData();
clearAllData(); // 清空所有数据
}
});
buttonRefresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
refreshData();
refreshData(); // 刷新数据
}
});
@ -130,7 +130,7 @@ public class HistoryActivity extends Activity {
buttonFilter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
performFilter();
performFilter(); // 执行筛选
}
});
@ -138,14 +138,14 @@ public class HistoryActivity extends Activity {
buttonStartDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDateTimePicker(editStartDate, true);
showDateTimePicker(editStartDate, true); // 显示日期时间选择器
}
});
buttonEndDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDateTimePicker(editEndDate, false);
showDateTimePicker(editEndDate, false); // 显示日期时间选择器
}
});
@ -153,7 +153,7 @@ public class HistoryActivity extends Activity {
buttonQuery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
performTimeRangeQuery();
performTimeRangeQuery(); // 执行时间区段查询
}
});
}
@ -163,11 +163,11 @@ public class HistoryActivity extends Activity {
*/
private void loadAllData() {
try {
List<SensorData> dataList = databaseHelper.getAllSensorData();
updateDisplayList(dataList);
Toast.makeText(this, "已加载所有数据,共 " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show();
List<SensorData> dataList = databaseHelper.getAllSensorData(); // 获取所有数据
updateDisplayList(dataList); // 更新显示列表
Toast.makeText(this, "已加载所有数据,共 " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show(); // 显示Toast
} catch (Exception e) {
Toast.makeText(this, "加载数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "加载数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
@ -176,11 +176,11 @@ public class HistoryActivity extends Activity {
*/
private void loadRecentData() {
try {
List<SensorData> dataList = databaseHelper.getRecentData(50); // 显示最近50条记录
updateDisplayList(dataList);
Toast.makeText(this, "已加载最近 " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show();
List<SensorData> dataList = databaseHelper.getRecentData(50); // 获取最近50条记录
updateDisplayList(dataList); // 更新显示列表
Toast.makeText(this, "已加载最近 " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show(); // 显示Toast
} catch (Exception e) {
Toast.makeText(this, "加载数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "加载数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
@ -188,36 +188,36 @@ public class HistoryActivity extends Activity {
*
*/
private void updateDisplayList(List<SensorData> dataList) {
displayList.clear();
displayList.clear(); // 清空显示列表
if (dataList.isEmpty()) {
displayList.add("暂无数据");
if (dataList.isEmpty()) { // 如果数据列表为空
displayList.add("暂无数据"); // 添加暂无数据
} else {
for (SensorData data : dataList) {
String displayText = formatDataForDisplay(data);
displayList.add(displayText);
String displayText = formatDataForDisplay(data); // 格式化数据为显示文本
displayList.add(displayText); // 添加显示文本
}
}
adapter.notifyDataSetChanged();
adapter.notifyDataSetChanged(); // 通知Adapter数据已改变
}
/**
*
*/
private String formatDataForDisplay(SensorData data) {
String triggerInfo = data.isTriggered() ? " [⚠️触发: " + data.getTriggerConditions() + "]" : " [✅正常]";
String triggerInfo = data.isTriggered() ? " [⚠️触发: " + data.getTriggerConditions() + "]" : " [✅正常]"; // 获取触发信息
return String.format(Locale.getDefault(),
"%s%s\n温度:%d℃ 湿度:%d%% 光照:%d%% 距离:%dcm 时间:%dmin 模式:%s",
data.getTimestamp(),
triggerInfo,
data.getTemperature(),
data.getHumidity(),
data.getLight(),
data.getDistance(),
data.getTimeMinutes(),
data.getMode().equals("auto") ? "自动" : "手动"
"%s%s\n温度:%d℃ 湿度:%d%% 光照:%d%% 距离:%dcm 时间:%dmin 模式:%s", // 格式化数据为显示文本
data.getTimestamp(), // 获取时间戳
triggerInfo, // 添加触发信息
data.getTemperature(), // 获取温度
data.getHumidity(), // 获取湿度
data.getLight(), // 获取光照
data.getDistance(), // 获取距离
data.getTimeMinutes(), // 获取时间(分钟)
data.getMode().equals("auto") ? "自动" : "手动" // 获取模式
);
}
@ -226,39 +226,39 @@ public class HistoryActivity extends Activity {
*/
private void showStatistics() {
try {
DataStatistics stats = databaseHelper.getDataStatistics();
DataStatistics stats = databaseHelper.getDataStatistics(); // 获取统计数据
if (stats.getTotalRecords() == 0) {
textViewStats.setText("暂无统计数据");
if (stats.getTotalRecords() == 0) { // 如果总记录数为0
textViewStats.setText("暂无统计数据"); // 显示暂无统计数据
return;
}
String statsText = String.format(Locale.getDefault(),
"📊 数据统计信息\n\n" +
"📝 总记录数: %d 条\n\n" +
"🌡️ 温度统计:\n" +
" 最低: %d℃\n" +
" 最高: %d℃\n" +
" 平均: %.1f℃\n\n" +
"💧 湿度统计:\n" +
" 最低: %d%%\n" +
" 最高: %d%%\n" +
" 平均: %.1f%%\n\n" +
"💡 光照统计:\n" +
" 最低: %d%%\n" +
" 最高: %d%%\n" +
" 平均: %.1f%%",
String statsText = String.format(Locale.getDefault(), // 格式化数据为显示文本
"📊 数据统计信息\n\n" + // 显示统计信息
"📝 总记录数: %d 条\n\n" + // 显示总记录数
"🌡️ 温度统计:\n" + // 显示温度统计
" 最低: %d℃\n" + // 显示最低温度
" 最高: %d℃\n" + // 显示最高温度
" 平均: %.1f℃\n\n" + // 显示平均温度
"💧 湿度统计:\n" + // 显示湿度统计
" 最低: %d%%\n" + // 显示最低湿度
" 最高: %d%%\n" + // 显示最高湿度
" 平均: %.1f%%\n\n" + // 显示平均湿度
"💡 光照统计:\n" + // 显示光照统计
" 最低: %d%%\n" + // 显示最低光照
" 最高: %d%%\n" + // 显示最高光照
" 平均: %.1f%%", // 显示平均光照
stats.getTotalRecords(),
stats.getMinTemperature(), stats.getMaxTemperature(), stats.getAvgTemperature(),
stats.getMinHumidity(), stats.getMaxHumidity(), stats.getAvgHumidity(),
stats.getMinLight(), stats.getMaxLight(), stats.getAvgLight()
stats.getTotalRecords(), // 获取总记录数
stats.getMinTemperature(), stats.getMaxTemperature(), stats.getAvgTemperature(), // 获取温度统计
stats.getMinHumidity(), stats.getMaxHumidity(), stats.getAvgHumidity(), // 获取湿度统计
stats.getMinLight(), stats.getMaxLight(), stats.getAvgLight() // 获取光照统计
);
textViewStats.setText(statsText);
textViewStats.setText(statsText); // 设置统计信息
} catch (Exception e) {
textViewStats.setText("统计信息加载失败: " + e.getMessage());
textViewStats.setText("统计信息加载失败: " + e.getMessage()); // 显示统计信息加载失败
}
}
@ -267,14 +267,14 @@ public class HistoryActivity extends Activity {
*/
private void clearAllData() {
try {
databaseHelper.clearAllData();
displayList.clear();
displayList.add("所有数据已清空");
adapter.notifyDataSetChanged();
databaseHelper.clearAllData(); // 清空所有数据
displayList.clear(); // 清空显示列表
displayList.add("所有数据已清空"); // 添加所有数据已清空
adapter.notifyDataSetChanged(); // 通知Adapter数据已改变
showStatistics(); // 更新统计信息
Toast.makeText(this, "所有数据已清空", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "所有数据已清空", Toast.LENGTH_SHORT).show(); // 显示Toast
} catch (Exception e) {
Toast.makeText(this, "清空数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "清空数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
@ -282,19 +282,19 @@ public class HistoryActivity extends Activity {
*
*/
private void refreshData() {
loadRecentData();
showStatistics();
Toast.makeText(this, "数据已刷新", Toast.LENGTH_SHORT).show();
loadRecentData(); // 加载最近数据
showStatistics(); // 显示统计信息
Toast.makeText(this, "数据已刷新", Toast.LENGTH_SHORT).show(); // 显示Toast
}
/**
*
*/
private void setupFilterSpinner() {
String[] filterOptions = {"全部数据", "已触发", "未触发"};
ArrayAdapter<String> filterAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, filterOptions);
filterAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerFilter.setAdapter(filterAdapter);
String[] filterOptions = {"全部数据", "已触发", "未触发"}; // 设置筛选选项
ArrayAdapter<String> filterAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, filterOptions); // 创建ArrayAdapter
filterAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 设置下拉框样式
spinnerFilter.setAdapter(filterAdapter); // 设置Spinner的Adapter
}
/**
@ -302,36 +302,36 @@ public class HistoryActivity extends Activity {
*/
private void performFilter() {
try {
int selectedPosition = spinnerFilter.getSelectedItemPosition();
List<SensorData> dataList;
int selectedPosition = spinnerFilter.getSelectedItemPosition(); // 获取选中的位置
List<SensorData> dataList; // 创建数据列表
switch (selectedPosition) {
case 0: // 全部数据
dataList = databaseHelper.getAllSensorData();
dataList = databaseHelper.getAllSensorData(); // 获取所有数据
break;
case 1: // 已触发
dataList = databaseHelper.getDataByTriggerStatus(true);
dataList = databaseHelper.getDataByTriggerStatus(true); // 获取已触发数据
break;
case 2: // 未触发
dataList = databaseHelper.getDataByTriggerStatus(false);
dataList = databaseHelper.getDataByTriggerStatus(false); // 获取未触发数据
break;
default:
dataList = databaseHelper.getAllSensorData();
dataList = databaseHelper.getAllSensorData(); // 获取所有数据
break;
}
updateDisplayList(dataList);
String filterName = (String) spinnerFilter.getSelectedItem();
Toast.makeText(this, "已筛选 " + filterName + ",共 " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show();
updateDisplayList(dataList); // 更新显示列表
String filterName = (String) spinnerFilter.getSelectedItem(); // 获取选中的筛选名称
Toast.makeText(this, "已筛选 " + filterName + ",共 " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show(); // 显示Toast
} catch (Exception e) {
Toast.makeText(this, "筛选失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "筛选失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
/**
*
*/
private void showDateTimePicker(final EditText editText, boolean isStartDate) {
private void showDateTimePicker(final EditText editText, boolean isStartDate) { // 显示日期时间选择器
// 先显示日期选择器
DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
@ -343,20 +343,20 @@ public class HistoryActivity extends Activity {
// 格式化并设置到EditText
String dateTime = String.format(Locale.getDefault(), "%04d-%02d-%02d %02d:%02d:00",
year, month + 1, dayOfMonth, hourOfDay, minute);
editText.setText(dateTime);
editText.setText(dateTime); // 设置到EditText
}
}, 0, 0, true);
timePickerDialog.show();
}, 0, 0, true); // 创建TimePickerDialog
timePickerDialog.show(); // 显示TimePickerDialog
}
}, 2024, 0, 1);
}, 2024, 0, 1); // 创建DatePickerDialog
// 如果是结束时间,默认设置为当前时间
if (!isStartDate) {
Date now = new Date();
datePickerDialog.updateDate(now.getYear() + 1900, now.getMonth(), now.getDate());
datePickerDialog.updateDate(now.getYear() + 1900, now.getMonth(), now.getDate()); // 更新日期
}
datePickerDialog.show();
datePickerDialog.show(); // 显示DatePickerDialog
}
/**
@ -364,23 +364,23 @@ public class HistoryActivity extends Activity {
*/
private void performTimeRangeQuery() {
try {
String startDateStr = editStartDate.getText().toString().trim();
String endDateStr = editEndDate.getText().toString().trim();
String startDateStr = editStartDate.getText().toString().trim(); // 获取开始时间
String endDateStr = editEndDate.getText().toString().trim(); // 获取结束时间
if (TextUtils.isEmpty(startDateStr) || TextUtils.isEmpty(endDateStr)) {
Toast.makeText(this, "请选择开始时间和结束时间", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "请选择开始时间和结束时间", Toast.LENGTH_SHORT).show(); // 显示Toast
return;
}
// 验证时间格式(简单验证)
if (startDateStr.length() < 19 || endDateStr.length() < 19) {
Toast.makeText(this, "时间格式不正确请使用yyyy-MM-dd HH:mm:ss", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "时间格式不正确请使用yyyy-MM-dd HH:mm:ss", Toast.LENGTH_SHORT).show(); // 显示Toast
return;
}
// 获取筛选条件
int filterPosition = spinnerFilter.getSelectedItemPosition();
Boolean triggerFilter = null;
int filterPosition = spinnerFilter.getSelectedItemPosition(); // 获取选中的位置
Boolean triggerFilter = null; // 创建触发过滤器
if (filterPosition == 1) {
triggerFilter = true; // 已触发
} else if (filterPosition == 2) {
@ -388,14 +388,14 @@ public class HistoryActivity extends Activity {
}
// 执行查询
List<SensorData> dataList = databaseHelper.getDataByDateRangeAndTriggerStatus(startDateStr, endDateStr, triggerFilter);
updateDisplayList(dataList);
List<SensorData> dataList = databaseHelper.getDataByDateRangeAndTriggerStatus(startDateStr, endDateStr, triggerFilter); // 执行查询
updateDisplayList(dataList); // 更新显示列表
String filterName = (String) spinnerFilter.getSelectedItem();
Toast.makeText(this, "查询完成:" + filterName + " " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show();
String filterName = (String) spinnerFilter.getSelectedItem(); // 获取选中的筛选名称
Toast.makeText(this, "查询完成:" + filterName + " " + dataList.size() + " 条记录", Toast.LENGTH_SHORT).show(); // 显示Toast
} catch (Exception e) {
Toast.makeText(this, "查询失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "查询失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
@ -403,7 +403,7 @@ public class HistoryActivity extends Activity {
*
*/
public void onBackButtonClicked(View view) {
finish();
finish(); // 结束当前Activity
}
/**
@ -411,26 +411,26 @@ public class HistoryActivity extends Activity {
*/
public void onExportButtonClicked(View view) {
try {
List<SensorData> allData = databaseHelper.getAllSensorData();
List<SensorData> allData = databaseHelper.getAllSensorData(); // 获取所有数据
if (allData.isEmpty()) {
Toast.makeText(this, "暂无数据可导出", Toast.LENGTH_SHORT).show();
if (allData.isEmpty()) { // 如果数据列表为空
Toast.makeText(this, "暂无数据可导出", Toast.LENGTH_SHORT).show(); // 显示Toast
return;
}
// 创建导出文件
File csvFile = createExportFile(allData);
File csvFile = createExportFile(allData); // 创建导出文件
if (csvFile != null && csvFile.exists()) {
if (csvFile != null && csvFile.exists()) { // 如果文件存在
// 文件创建成功,尝试打开
openCsvFile(csvFile);
Toast.makeText(this, "数据导出成功!共 " + allData.size() + " 条记录\n文件位置: " + csvFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
openCsvFile(csvFile); // 打开CSV文件
Toast.makeText(this, "数据导出成功!共 " + allData.size() + " 条记录\n文件位置: " + csvFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); // 显示Toast
} else {
Toast.makeText(this, "文件创建失败,请检查存储权限", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "文件创建失败,请检查存储权限", Toast.LENGTH_SHORT).show(); // 显示Toast
}
} catch (Exception e) {
Toast.makeText(this, "导出数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "导出数据失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
@ -440,29 +440,29 @@ public class HistoryActivity extends Activity {
private File createExportFile(List<SensorData> dataList) {
try {
// 创建文件名(带时间戳)
String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String fileName = "战场探测数据_" + timestamp + ".csv";
String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); // 获取当前时间戳
String fileName = "战场探测数据_" + timestamp + ".csv"; // 创建文件名
// 获取下载目录
File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
if (!downloadsDir.exists()) {
downloadsDir.mkdirs();
File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); // 获取下载目录
if (!downloadsDir.exists()) { // 如果下载目录不存在
downloadsDir.mkdirs(); // 创建下载目录
}
File csvFile = new File(downloadsDir, fileName);
File csvFile = new File(downloadsDir, fileName); // 创建CSV文件
// 写入CSV数据
FileWriter writer = new FileWriter(csvFile, false);
FileWriter writer = new FileWriter(csvFile, false); // 创建FileWriter
// 写入BOM确保Excel正确显示中文
writer.write('\ufeff');
writer.write('\ufeff'); // 写入BOM
// 写入标题头
writer.write("数据记录时间,触发状态,触发条件,温度(℃),湿度(%),光照(%),距离(cm),运行时间(min),工作模式\n");
writer.write("数据记录时间,触发状态,触发条件,温度(℃),湿度(%),光照(%),距离(cm),运行时间(min),工作模式\n"); // 写入标题头
// 写入数据行
for (SensorData data : dataList) {
writer.write(String.format(Locale.getDefault(),
writer.write(String.format(Locale.getDefault(), // 写入数据行
"%s,%s,\"%s\",%d,%d,%d,%d,%d,%s\n",
data.getTimestamp(),
data.isTriggered() ? "已触发" : "正常",
@ -476,12 +476,12 @@ public class HistoryActivity extends Activity {
));
}
writer.close();
return csvFile;
writer.close(); // 关闭FileWriter
return csvFile; // 返回CSV文件
} catch (IOException e) {
e.printStackTrace();
return null;
e.printStackTrace(); // 打印异常
return null; // 返回null
}
}
@ -490,34 +490,34 @@ public class HistoryActivity extends Activity {
*/
private void openCsvFile(File csvFile) {
try {
Uri fileUri = Uri.fromFile(csvFile);
Uri fileUri = Uri.fromFile(csvFile); // 获取文件URI
// 尝试用Excel打开
Intent excelIntent = new Intent(Intent.ACTION_VIEW);
excelIntent.setDataAndType(fileUri, "application/vnd.ms-excel");
excelIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
excelIntent.setDataAndType(fileUri, "application/vnd.ms-excel"); // 设置数据类型
excelIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 设置标志
if (excelIntent.resolveActivity(getPackageManager()) != null) {
startActivity(excelIntent);
return;
startActivity(excelIntent); // 启动Activity
return; // 返回
}
// 如果没有Excel尝试用文本编辑器打开
Intent textIntent = new Intent(Intent.ACTION_VIEW);
textIntent.setDataAndType(fileUri, "text/plain");
textIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
textIntent.setDataAndType(fileUri, "text/plain"); // 设置数据类型
textIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 设置标志
if (textIntent.resolveActivity(getPackageManager()) != null) {
startActivity(textIntent);
return;
startActivity(textIntent); // 启动Activity
return; // 返回
}
// 如果都没有,提供分享选项
shareFile(csvFile);
shareFile(csvFile); // 分享文件
} catch (Exception e) {
// 如果打开失败,尝试分享文件
shareFile(csvFile);
shareFile(csvFile); // 分享文件
}
}
@ -526,17 +526,17 @@ public class HistoryActivity extends Activity {
*/
private void shareFile(File csvFile) {
try {
Uri fileUri = Uri.fromFile(csvFile);
Uri fileUri = Uri.fromFile(csvFile); // 获取文件URI
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/csv");
shareIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "战场探测系统数据导出");
shareIntent.putExtra(Intent.EXTRA_TEXT, "战场环境探测系统的传感器数据记录文件");
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent shareIntent = new Intent(Intent.ACTION_SEND); // 创建Intent
shareIntent.setType("text/csv"); // 设置数据类型
shareIntent.putExtra(Intent.EXTRA_STREAM, fileUri); // 设置数据
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "战场探测系统数据导出"); // 设置主题
shareIntent.putExtra(Intent.EXTRA_TEXT, "战场环境探测系统的传感器数据记录文件"); // 设置文本
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 设置标志
Intent chooser = Intent.createChooser(shareIntent, "选择应用打开CSV文件");
startActivity(chooser);
Intent chooser = Intent.createChooser(shareIntent, "选择应用打开CSV文件"); // 创建Intent
startActivity(chooser); // 启动Activity
} catch (Exception e) {
Toast.makeText(this, "无法打开文件,但已保存到下载文件夹: " + csvFile.getName(), Toast.LENGTH_LONG).show();
@ -547,7 +547,7 @@ public class HistoryActivity extends Activity {
*
*/
private String getCurrentTimestamp() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
return sdf.format(new Date());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); // 创建SimpleDateFormat
return sdf.format(new Date()); // 返回当前时间戳
}
}

@ -65,13 +65,13 @@ public class MainActivity extends Activity {
private BluetoothAdapter _bluetooth = BluetoothAdapter.getDefaultAdapter(); //获取本地蓝牙适配器,即蓝牙设备
// 数据库相关变量
private DatabaseHelper databaseHelper;
private int currentTemperature = 0;
private int currentHumidity = 0;
private int currentLight = 0;
private int currentDistance = 0;
private int currentTimeMinutes = 0;
private String currentMode = "auto";
private DatabaseHelper databaseHelper; // 数据库助手
private int currentTemperature = 0; // 当前温度
private int currentHumidity = 0; // 当前湿度
private int currentLight = 0; // 当前光照强度
private int currentDistance = 0; // 当前距离
private int currentTimeMinutes = 0; // 当前时间(分钟)
private String currentMode = "auto"; // 当前模式
// 数据记录设置
private boolean autoRecordEnabled = true; // 自动记录开关
@ -602,47 +602,45 @@ public class MainActivity extends Activity {
*/
private void saveDataToDatabase() {
try {
// 检查是否启用自动记录
if (!autoRecordEnabled) {
if (!autoRecordEnabled) { // 检查是否启用自动记录
return;
}
// 检查记录间隔
long currentTime = System.currentTimeMillis();
if (currentTime - lastRecordTime < recordingInterval) {
// 检查是否达到记录间隔
long currentTime = System.currentTimeMillis(); // 获取当前时间
if (currentTime - lastRecordTime < recordingInterval) { // 检查是否达到记录间隔
return;
}
lastRecordTime = currentTime;
lastRecordTime = currentTime; // 更新上次记录时间
// 检测是否触发报警条件
boolean isTriggered = false;
StringBuilder triggerConditions = new StringBuilder();
StringBuilder triggerConditions = new StringBuilder(); // 触发条件字符串
if (currentTemperature > thresholdTemp) {
isTriggered = true;
triggerConditions.append("温度超标(").append(currentTemperature).append("℃>").append(thresholdTemp).append("℃); ");
if (currentTemperature > thresholdTemp) { // 检查温度是否超标
isTriggered = true; // 设置触发标志
triggerConditions.append("温度超标(").append(currentTemperature).append("℃>").append(thresholdTemp).append("℃); "); // 添加触发条件
}
if (currentHumidity > thresholdHumi) {
if (currentHumidity > thresholdHumi) { // 检查湿度是否超标
isTriggered = true;
triggerConditions.append("湿度超标(").append(currentHumidity).append("%>").append(thresholdHumi).append("%); ");
triggerConditions.append("湿度超标(").append(currentHumidity).append("%>").append(thresholdHumi).append("%); "); // 添加触发条件
}
if (currentDistance < thresholdDistance && currentDistance > 0) {
isTriggered = true;
triggerConditions.append("距离过近(").append(currentDistance).append("cm<").append(thresholdDistance).append("cm); ");
if (currentDistance < thresholdDistance && currentDistance > 0) { // 检查距离是否过近
isTriggered = true; // 设置触发标志
triggerConditions.append("距离过近(").append(currentDistance).append("cm<").append(thresholdDistance).append("cm); "); // 添加触发条件
}
if (currentLight > thresholdLight) {
isTriggered = true;
triggerConditions.append("光照过强(").append(currentLight).append("%>").append(thresholdLight).append("%); ");
if (currentLight > thresholdLight) { // 检查光照是否过强
isTriggered = true; // 设置触发标志
triggerConditions.append("光照过强(").append(currentLight).append("%>").append(thresholdLight).append("%); "); // 添加触发条件
}
// 处理触发条件字符串
String triggerText = triggerConditions.length() > 0 ?
triggerConditions.toString().trim() : "正常";
triggerConditions.toString().trim() : "正常"; // 处理触发条件字符串
long id = databaseHelper.addSensorData(
long id = databaseHelper.addSensorData( // 保存数据到数据库
currentTemperature,
currentHumidity,
currentLight,
@ -658,7 +656,7 @@ public class MainActivity extends Activity {
// 可选自动清理旧数据保留最近30天的数据
if (databaseHelper.getRecordCount() > 1000) {
int deletedRows = databaseHelper.deleteOldData(30);
int deletedRows = databaseHelper.deleteOldData(30); // 删除旧数据
if (deletedRows > 0) {
Log.d("MainActivity", "已删除 " + deletedRows + " 条旧数据");
}
@ -672,7 +670,7 @@ public class MainActivity extends Activity {
*
*/
public void onHistoryButtonClicked(View view) {
Intent intent = new Intent(this, HistoryActivity.class);
Intent intent = new Intent(this, HistoryActivity.class); // 跳转历史记录页面
startActivity(intent);
}

@ -24,7 +24,7 @@ import java.util.List;
import com.test.Bluetooh_736_2.Database.DatabaseHelper;
import com.test.Bluetooh_736_2.Models.PresetScheme;
public class PresetManagerActivity extends Activity {
public class PresetManagerActivity extends Activity { // 预设方案管理Activity
private ListView listPresets;
private Button btnAddPreset;
@ -37,47 +37,47 @@ public class PresetManagerActivity extends Activity {
private PresetScheme selectedScheme;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preset_manager);
protected void onCreate(Bundle savedInstanceState) { // 创建Activity
super.onCreate(savedInstanceState); // 创建Activity
setContentView(R.layout.activity_preset_manager); // 设置布局
// 初始化数据库
dbHelper = new DatabaseHelper(this);
dbHelper = new DatabaseHelper(this); // 初始化数据库
// 初始化UI组件
initViews();
initViews(); // 初始化UI组件
// 加载预设方案数据
loadPresetSchemes();
loadPresetSchemes(); // 加载预设方案数据
// 设置事件监听器
setupListeners();
setupListeners(); // 设置事件监听器
}
private void initViews() {
listPresets = findViewById(R.id.listPresets);
btnAddPreset = findViewById(R.id.btnAddPreset);
btnCancel = findViewById(R.id.btnCancel);
btnConfirm = findViewById(R.id.btnConfirm);
private void initViews() { // 初始化UI组件
listPresets = findViewById(R.id.listPresets); // 预设方案列表
btnAddPreset = findViewById(R.id.btnAddPreset); // 添加预设方案按钮
btnCancel = findViewById(R.id.btnCancel); // 取消按钮
btnConfirm = findViewById(R.id.btnConfirm); // 确定按钮
// 初始化适配器
presetSchemes = new ArrayList<>();
adapter = new PresetSchemeAdapter();
listPresets.setAdapter(adapter);
presetSchemes = new ArrayList<>(); // 预设方案列表
adapter = new PresetSchemeAdapter(); // 预设方案适配器
listPresets.setAdapter(adapter); // 设置适配器
}
private void loadPresetSchemes() {
presetSchemes.clear();
presetSchemes.addAll(dbHelper.getAllPresetSchemes());
adapter.notifyDataSetChanged();
private void loadPresetSchemes() { // 加载预设方案数据
presetSchemes.clear(); // 清空预设方案列表
presetSchemes.addAll(dbHelper.getAllPresetSchemes()); // 添加预设方案
adapter.notifyDataSetChanged(); // 通知适配器数据已改变
}
private void setupListeners() {
private void setupListeners() { // 设置事件监听器
// 添加预设方案按钮
btnAddPreset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPresetEditor(null);
showPresetEditor(null); // 显示预设方案编辑器
}
});
@ -85,7 +85,7 @@ public class PresetManagerActivity extends Activity {
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
finish(); // 结束当前Activity
}
});
@ -94,11 +94,11 @@ public class PresetManagerActivity extends Activity {
@Override
public void onClick(View v) {
if (selectedScheme != null) {
applyPresetScheme(selectedScheme);
setResult(RESULT_OK);
finish();
applyPresetScheme(selectedScheme); // 应用预设方案
setResult(RESULT_OK); // 设置返回结果
finish(); // 结束当前Activity
} else {
Toast.makeText(PresetManagerActivity.this, "请选择一个预设方案", Toast.LENGTH_SHORT).show();
Toast.makeText(PresetManagerActivity.this, "请选择一个预设方案", Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
});
@ -107,78 +107,78 @@ public class PresetManagerActivity extends Activity {
/**
*
*/
private void showPresetEditor(final PresetScheme scheme) {
LayoutInflater inflater = getLayoutInflater();
View dialogView = inflater.inflate(R.layout.dialog_preset_editor, null);
private void showPresetEditor(final PresetScheme scheme) { // 显示预设方案编辑器
LayoutInflater inflater = getLayoutInflater(); // 获取LayoutInflater
View dialogView = inflater.inflate(R.layout.dialog_preset_editor, null); // 获取对话框视图
// 获取对话框控件
TextView textDialogTitle = dialogView.findViewById(R.id.textDialogTitle);
EditText editPresetName = dialogView.findViewById(R.id.editPresetName);
EditText editPresetDescription = dialogView.findViewById(R.id.editPresetDescription);
EditText editTempThreshold = dialogView.findViewById(R.id.editTempThreshold);
EditText editHumiThreshold = dialogView.findViewById(R.id.editHumiThreshold);
EditText editDistanceThreshold = dialogView.findViewById(R.id.editDistanceThreshold);
EditText editLightThreshold = dialogView.findViewById(R.id.editLightThreshold);
SeekBar seekRecordInterval = dialogView.findViewById(R.id.seekRecordInterval);
TextView textIntervalValue = dialogView.findViewById(R.id.textIntervalValue);
CheckBox checkAutoRecord = dialogView.findViewById(R.id.checkAutoRecord);
Button btnCancel = dialogView.findViewById(R.id.btnCancel);
Button btnSave = dialogView.findViewById(R.id.btnSave);
TextView textDialogTitle = dialogView.findViewById(R.id.textDialogTitle); // 对话框标题
EditText editPresetName = dialogView.findViewById(R.id.editPresetName); // 预设方案名称
EditText editPresetDescription = dialogView.findViewById(R.id.editPresetDescription); // 预设方案描述
EditText editTempThreshold = dialogView.findViewById(R.id.editTempThreshold); // 温度阈值
EditText editHumiThreshold = dialogView.findViewById(R.id.editHumiThreshold); // 湿度阈值
EditText editDistanceThreshold = dialogView.findViewById(R.id.editDistanceThreshold); // 距离阈值
EditText editLightThreshold = dialogView.findViewById(R.id.editLightThreshold); // 光照阈值
SeekBar seekRecordInterval = dialogView.findViewById(R.id.seekRecordInterval); // 记录间隔
TextView textIntervalValue = dialogView.findViewById(R.id.textIntervalValue); // 记录间隔值
CheckBox checkAutoRecord = dialogView.findViewById(R.id.checkAutoRecord); // 自动记录
Button btnCancel = dialogView.findViewById(R.id.btnCancel); // 取消按钮
Button btnSave = dialogView.findViewById(R.id.btnSave); // 保存按钮
// 设置标题
if (scheme == null) {
textDialogTitle.setText("添加预设方案");
textDialogTitle.setText("添加预设方案"); // 设置标题
} else {
textDialogTitle.setText("编辑预设方案");
textDialogTitle.setText("编辑预设方案"); // 设置标题
}
// 填充数据
if (scheme != null) {
editPresetName.setText(scheme.getName());
editPresetDescription.setText(scheme.getDescription());
editTempThreshold.setText(String.valueOf(scheme.getTempThreshold()));
editHumiThreshold.setText(String.valueOf(scheme.getHumiThreshold()));
editDistanceThreshold.setText(String.valueOf(scheme.getDistanceThreshold()));
editLightThreshold.setText(String.valueOf(scheme.getLightThreshold()));
editPresetName.setText(scheme.getName()); // 设置预设方案名称
editPresetDescription.setText(scheme.getDescription()); // 设置预设方案描述
editTempThreshold.setText(String.valueOf(scheme.getTempThreshold())); // 设置温度阈值
editHumiThreshold.setText(String.valueOf(scheme.getHumiThreshold())); // 设置湿度阈值
editDistanceThreshold.setText(String.valueOf(scheme.getDistanceThreshold())); // 设置距离阈值
editLightThreshold.setText(String.valueOf(scheme.getLightThreshold())); // 设置光照阈值
int progress = (scheme.getRecordInterval() - 500) / 500;
seekRecordInterval.setProgress(progress);
checkAutoRecord.setChecked(scheme.isAutoRecord());
int progress = (scheme.getRecordInterval() - 500) / 500; // 设置记录间隔
seekRecordInterval.setProgress(progress); // 设置记录间隔
checkAutoRecord.setChecked(scheme.isAutoRecord()); // 设置自动记录
} else {
// 默认值
editTempThreshold.setText("45");
editHumiThreshold.setText("35");
editDistanceThreshold.setText("10");
editLightThreshold.setText("70");
seekRecordInterval.setProgress(1);
checkAutoRecord.setChecked(true);
editTempThreshold.setText("45"); // 设置温度阈值
editHumiThreshold.setText("35"); // 设置湿度阈值
editDistanceThreshold.setText("10"); // 设置距离阈值
editLightThreshold.setText("70"); // 设置光照阈值
seekRecordInterval.setProgress(1); // 设置记录间隔
checkAutoRecord.setChecked(true); // 设置自动记录
}
// 设置SeekBar监听器
seekRecordInterval.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int interval = (progress * 500) + 500;
if (interval < 1000) {
textIntervalValue.setText(String.format("%.1f 秒", interval / 1000.0));
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 设置记录间隔
int interval = (progress * 500) + 500; // 设置记录间隔
if (interval < 1000) { // 如果记录间隔小于1000
textIntervalValue.setText(String.format("%.1f 秒", interval / 1000.0)); // 设置记录间隔值
} else {
textIntervalValue.setText(String.format("%d 秒", interval / 1000));
textIntervalValue.setText(String.format("%d 秒", interval / 1000)); // 设置记录间隔值
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
public void onStartTrackingTouch(SeekBar seekBar) {} // 开始拖动
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
public void onStopTrackingTouch(SeekBar seekBar) {} // 停止拖动
});
// 初始化间隔显示
int interval = (seekRecordInterval.getProgress() * 500) + 500;
if (interval < 1000) {
textIntervalValue.setText(String.format("%.1f 秒", interval / 1000.0));
int interval = (seekRecordInterval.getProgress() * 500) + 500; // 设置记录间隔
if (interval < 1000) { // 如果记录间隔小于1000
textIntervalValue.setText(String.format("%.1f 秒", interval / 1000.0)); // 设置记录间隔值
} else {
textIntervalValue.setText(String.format("%d 秒", interval / 1000));
textIntervalValue.setText(String.format("%d 秒", interval / 1000)); // 设置记录间隔值
}
// 创建对话框
@ -191,7 +191,7 @@ public class PresetManagerActivity extends Activity {
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
dialog.dismiss(); // 关闭对话框
}
});
@ -199,39 +199,39 @@ public class PresetManagerActivity extends Activity {
@Override
public void onClick(View v) {
try {
String name = editPresetName.getText().toString().trim();
String description = editPresetDescription.getText().toString().trim();
int tempThreshold = Integer.parseInt(editTempThreshold.getText().toString());
int humiThreshold = Integer.parseInt(editHumiThreshold.getText().toString());
int distanceThreshold = Integer.parseInt(editDistanceThreshold.getText().toString());
int lightThreshold = Integer.parseInt(editLightThreshold.getText().toString());
int recordInterval = (seekRecordInterval.getProgress() * 500) + 500;
boolean autoRecord = checkAutoRecord.isChecked();
String name = editPresetName.getText().toString().trim(); // 获取预设方案名称
String description = editPresetDescription.getText().toString().trim(); // 获取预设方案描述
int tempThreshold = Integer.parseInt(editTempThreshold.getText().toString()); // 获取温度阈值
int humiThreshold = Integer.parseInt(editHumiThreshold.getText().toString()); // 获取湿度阈值
int distanceThreshold = Integer.parseInt(editDistanceThreshold.getText().toString()); // 获取距离阈值
int lightThreshold = Integer.parseInt(editLightThreshold.getText().toString()); // 获取光照阈值
int recordInterval = (seekRecordInterval.getProgress() * 500) + 500; // 获取记录间隔
boolean autoRecord = checkAutoRecord.isChecked(); // 获取自动记录
// 验证输入
if (name.isEmpty()) {
Toast.makeText(PresetManagerActivity.this, "请输入方案名称", Toast.LENGTH_SHORT).show();
return;
Toast.makeText(PresetManagerActivity.this, "请输入方案名称", Toast.LENGTH_SHORT).show(); // 显示Toast
return; // 返回
}
if (tempThreshold < 0 || tempThreshold > 100) {
Toast.makeText(PresetManagerActivity.this, "温度阈值应在0-100℃之间", Toast.LENGTH_SHORT).show();
return;
Toast.makeText(PresetManagerActivity.this, "温度阈值应在0-100℃之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return; // 返回
}
if (humiThreshold < 0 || humiThreshold > 100) {
Toast.makeText(PresetManagerActivity.this, "湿度阈值应在0-100%之间", Toast.LENGTH_SHORT).show();
return;
Toast.makeText(PresetManagerActivity.this, "湿度阈值应在0-100%之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return; // 返回
}
if (distanceThreshold < 0 || distanceThreshold > 500) {
Toast.makeText(PresetManagerActivity.this, "距离阈值应在0-500cm之间", Toast.LENGTH_SHORT).show();
return;
Toast.makeText(PresetManagerActivity.this, "距离阈值应在0-500cm之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return; // 返回
}
if (lightThreshold < 0 || lightThreshold > 100) {
Toast.makeText(PresetManagerActivity.this, "光照阈值应在0-100%之间", Toast.LENGTH_SHORT).show();
return;
Toast.makeText(PresetManagerActivity.this, "光照阈值应在0-100%之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return; // 返回
}
// 保存方案
@ -240,53 +240,53 @@ public class PresetManagerActivity extends Activity {
long result = dbHelper.addPresetScheme(name, description, tempThreshold, humiThreshold,
distanceThreshold, lightThreshold, recordInterval, autoRecord);
if (result > 0) {
Toast.makeText(PresetManagerActivity.this, "方案添加成功", Toast.LENGTH_SHORT).show();
loadPresetSchemes();
dialog.dismiss();
Toast.makeText(PresetManagerActivity.this, "方案添加成功", Toast.LENGTH_SHORT).show(); // 显示Toast
loadPresetSchemes(); // 加载预设方案
dialog.dismiss(); // 关闭对话框
} else {
Toast.makeText(PresetManagerActivity.this, "方案添加失败", Toast.LENGTH_SHORT).show();
Toast.makeText(PresetManagerActivity.this, "方案添加失败", Toast.LENGTH_SHORT).show(); // 显示Toast
}
} else {
// 更新现有方案
int result = dbHelper.updatePresetScheme(scheme.getId(), name, description, tempThreshold, humiThreshold,
distanceThreshold, lightThreshold, recordInterval, autoRecord);
if (result > 0) {
Toast.makeText(PresetManagerActivity.this, "方案更新成功", Toast.LENGTH_SHORT).show();
loadPresetSchemes();
dialog.dismiss();
Toast.makeText(PresetManagerActivity.this, "方案更新成功", Toast.LENGTH_SHORT).show(); // 显示Toast
loadPresetSchemes(); // 加载预设方案
dialog.dismiss(); // 关闭对话框
} else {
Toast.makeText(PresetManagerActivity.this, "方案更新失败", Toast.LENGTH_SHORT).show();
}
}
} catch (NumberFormatException e) {
Toast.makeText(PresetManagerActivity.this, "请输入有效的数值", Toast.LENGTH_SHORT).show();
Toast.makeText(PresetManagerActivity.this, "请输入有效的数值", Toast.LENGTH_SHORT).show(); // 显示Toast
} catch (Exception e) {
Toast.makeText(PresetManagerActivity.this, "保存失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(PresetManagerActivity.this, "保存失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
});
dialog.show();
dialog.show(); // 显示对话框
}
/**
*
*/
private void applyPresetScheme(PresetScheme scheme) {
SharedPreferences prefs = getSharedPreferences("BattlefieldSettings", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
SharedPreferences prefs = getSharedPreferences("BattlefieldSettings", MODE_PRIVATE); // 获取SharedPreferences
SharedPreferences.Editor editor = prefs.edit(); // 获取Editor
editor.putInt("threshold_temp", scheme.getTempThreshold());
editor.putInt("threshold_humi", scheme.getHumiThreshold());
editor.putInt("threshold_distance", scheme.getDistanceThreshold());
editor.putInt("threshold_light", scheme.getLightThreshold());
editor.putInt("recording_interval", scheme.getRecordInterval());
editor.putBoolean("auto_record", scheme.isAutoRecord());
editor.putInt("threshold_temp", scheme.getTempThreshold()); // 设置温度阈值
editor.putInt("threshold_humi", scheme.getHumiThreshold()); // 设置湿度阈值
editor.putInt("threshold_distance", scheme.getDistanceThreshold()); // 设置距离阈值
editor.putInt("threshold_light", scheme.getLightThreshold()); // 设置光照阈值
editor.putInt("recording_interval", scheme.getRecordInterval()); // 设置记录间隔
editor.putBoolean("auto_record", scheme.isAutoRecord()); // 设置自动记录
editor.apply();
editor.apply(); // 应用
Toast.makeText(this, "已应用预设方案: " + scheme.getName(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "已应用预设方案: " + scheme.getName(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
/**
@ -296,23 +296,23 @@ public class PresetManagerActivity extends Activity {
@Override
public int getCount() {
return presetSchemes.size();
return presetSchemes.size(); // 返回预设方案数量
}
@Override
public PresetScheme getItem(int position) {
return presetSchemes.get(position);
return presetSchemes.get(position); // 返回预设方案
}
@Override
public long getItemId(int position) {
return position;
return position; // 返回位置
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item_preset_scheme, parent, false);
convertView = getLayoutInflater().inflate(R.layout.item_preset_scheme, parent, false); // 获取布局
}
PresetScheme scheme = getItem(position);
@ -327,30 +327,30 @@ public class PresetManagerActivity extends Activity {
Button btnDeletePreset = convertView.findViewById(R.id.btnDeletePreset);
// 设置数据
textPresetName.setText(scheme.getName());
textPresetDescription.setText(scheme.getDescription());
textPresetSummary.setText(scheme.getSummary());
textPresetName.setText(scheme.getName()); // 设置预设方案名称
textPresetDescription.setText(scheme.getDescription()); // 设置预设方案描述
textPresetSummary.setText(scheme.getSummary()); // 设置预设方案摘要
// 显示默认标签
if (scheme.isDefault()) {
textDefaultTag.setVisibility(View.VISIBLE);
textDefaultTag.setVisibility(View.VISIBLE); // 设置默认标签可见
} else {
textDefaultTag.setVisibility(View.GONE);
textDefaultTag.setVisibility(View.GONE); // 设置默认标签不可见
}
// 设置按钮监听器
btnSelectPreset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectedScheme = scheme;
Toast.makeText(PresetManagerActivity.this, "已选择: " + scheme.getName(), Toast.LENGTH_SHORT).show();
selectedScheme = scheme; // 设置选中方案
Toast.makeText(PresetManagerActivity.this, "已选择: " + scheme.getName(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
});
btnEditPreset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPresetEditor(scheme);
showPresetEditor(scheme); // 显示预设方案编辑器
}
});
@ -358,20 +358,20 @@ public class PresetManagerActivity extends Activity {
@Override
public void onClick(View v) {
if (scheme.isDefault()) {
Toast.makeText(PresetManagerActivity.this, "不能删除默认方案", Toast.LENGTH_SHORT).show();
Toast.makeText(PresetManagerActivity.this, "不能删除默认方案", Toast.LENGTH_SHORT).show(); // 显示Toast
} else {
showDeleteConfirmDialog(scheme);
showDeleteConfirmDialog(scheme); // 显示删除确认对话框
}
}
});
// 禁用删除默认方案
if (scheme.isDefault()) {
btnDeletePreset.setEnabled(false);
btnDeletePreset.setAlpha(0.5f);
btnDeletePreset.setEnabled(false); // 禁用删除按钮
btnDeletePreset.setAlpha(0.5f); // 设置删除按钮透明度
} else {
btnDeletePreset.setEnabled(true);
btnDeletePreset.setAlpha(1.0f);
btnDeletePreset.setEnabled(true); // 启用删除按钮
btnDeletePreset.setAlpha(1.0f); // 设置删除按钮透明度
}
return convertView;
@ -390,10 +390,10 @@ public class PresetManagerActivity extends Activity {
public void onClick(DialogInterface dialog, int which) {
int result = dbHelper.deletePresetScheme(scheme.getId());
if (result > 0) {
Toast.makeText(PresetManagerActivity.this, "方案删除成功", Toast.LENGTH_SHORT).show();
loadPresetSchemes();
Toast.makeText(PresetManagerActivity.this, "方案删除成功", Toast.LENGTH_SHORT).show(); // 显示Toast
loadPresetSchemes(); // 加载预设方案
} else {
Toast.makeText(PresetManagerActivity.this, "方案删除失败", Toast.LENGTH_SHORT).show();
Toast.makeText(PresetManagerActivity.this, "方案删除失败", Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
})

@ -15,60 +15,60 @@ import android.widget.Toast;
public class SettingsActivity extends Activity {
// UI组件
private CheckBox checkAutoRecord;
private SeekBar seekRecordInterval;
private TextView textIntervalValue;
private EditText editThresholdTemp;
private EditText editThresholdHumi;
private EditText editThresholdDistance;
private EditText editThresholdLight;
private Button buttonSave;
private Button buttonCancel;
private Button buttonReset;
private Button buttonPresetManager;
private CheckBox checkAutoRecord; // 自动记录
private SeekBar seekRecordInterval; // 记录间隔
private TextView textIntervalValue; // 记录间隔值
private EditText editThresholdTemp; // 温度阈值
private EditText editThresholdHumi; // 湿度阈值
private EditText editThresholdDistance; // 距离阈值
private EditText editThresholdLight; // 光照阈值
private Button buttonSave; // 保存
private Button buttonCancel; // 取消
private Button buttonReset; // 重置
private Button buttonPresetManager; // 预设方案管理
// 设置值
private boolean autoRecordEnabled = true;
private int recordingInterval = 1000;
private int thresholdTemp = 45;
private int thresholdHumi = 35;
private int thresholdDistance = 10;
private int thresholdLight = 70;
private boolean autoRecordEnabled = true; // 自动记录
private int recordingInterval = 1000; // 记录间隔
private int thresholdTemp = 45; // 温度阈值
private int thresholdHumi = 35; // 湿度阈值
private int thresholdDistance = 10; // 距离阈值
private int thresholdLight = 70; // 光照阈值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
protected void onCreate(Bundle savedInstanceState) { // 创建Activity
super.onCreate(savedInstanceState); // 创建Activity
setContentView(R.layout.activity_settings); // 设置布局
// 初始化UI组件
initViews();
initViews(); // 初始化UI组件
// 加载当前设置
loadCurrentSettings();
loadCurrentSettings(); // 加载当前设置
// 设置UI值
updateUI();
updateUI(); // 设置UI值
// 设置事件监听器
setupListeners();
setupListeners(); // 设置事件监听器
}
private void initViews() {
checkAutoRecord = findViewById(R.id.checkAutoRecord);
seekRecordInterval = findViewById(R.id.seekRecordInterval);
textIntervalValue = findViewById(R.id.textIntervalValue);
editThresholdTemp = findViewById(R.id.editThresholdTemp);
editThresholdHumi = findViewById(R.id.editThresholdHumi);
editThresholdDistance = findViewById(R.id.editThresholdDistance);
editThresholdLight = findViewById(R.id.editThresholdLight);
buttonSave = findViewById(R.id.buttonSave);
buttonCancel = findViewById(R.id.buttonCancel);
buttonReset = findViewById(R.id.buttonReset);
buttonPresetManager = findViewById(R.id.buttonPresetManager);
private void initViews() { // 初始化UI组件
checkAutoRecord = findViewById(R.id.checkAutoRecord); // 自动记录
seekRecordInterval = findViewById(R.id.seekRecordInterval); // 记录间隔
textIntervalValue = findViewById(R.id.textIntervalValue); // 记录间隔值
editThresholdTemp = findViewById(R.id.editThresholdTemp); // 温度阈值
editThresholdHumi = findViewById(R.id.editThresholdHumi); // 湿度阈值
editThresholdDistance = findViewById(R.id.editThresholdDistance); // 距离阈值
editThresholdLight = findViewById(R.id.editThresholdLight); // 光照阈值
buttonSave = findViewById(R.id.buttonSave); // 保存
buttonCancel = findViewById(R.id.buttonCancel); // 取消
buttonReset = findViewById(R.id.buttonReset); // 重置
buttonPresetManager = findViewById(R.id.buttonPresetManager); // 预设方案管理
}
private void loadCurrentSettings() {
SharedPreferences prefs = getSharedPreferences("BattlefieldSettings", MODE_PRIVATE);
private void loadCurrentSettings() { // 加载当前设置
SharedPreferences prefs = getSharedPreferences("BattlefieldSettings", MODE_PRIVATE); // 获取SharedPreferences
autoRecordEnabled = prefs.getBoolean("auto_record", true);
recordingInterval = prefs.getInt("recording_interval", 1000);
thresholdTemp = prefs.getInt("threshold_temp", 45);
@ -77,41 +77,41 @@ public class SettingsActivity extends Activity {
thresholdLight = prefs.getInt("threshold_light", 70);
}
private void updateUI() {
checkAutoRecord.setChecked(autoRecordEnabled);
private void updateUI() { // 设置UI值
checkAutoRecord.setChecked(autoRecordEnabled); // 设置自动记录
// 设置记录间隔 (0.5秒到30秒步长0.5秒)
int progress = (recordingInterval - 500) / 500; // 转换为SeekBar进度值
seekRecordInterval.setProgress(progress);
updateIntervalText();
seekRecordInterval.setProgress(progress); // 设置记录间隔
updateIntervalText(); // 更新记录间隔值
editThresholdTemp.setText(String.valueOf(thresholdTemp));
editThresholdHumi.setText(String.valueOf(thresholdHumi));
editThresholdDistance.setText(String.valueOf(thresholdDistance));
editThresholdLight.setText(String.valueOf(thresholdLight));
editThresholdTemp.setText(String.valueOf(thresholdTemp)); // 设置温度阈值
editThresholdHumi.setText(String.valueOf(thresholdHumi)); // 设置湿度阈值
editThresholdDistance.setText(String.valueOf(thresholdDistance)); // 设置距离阈值
editThresholdLight.setText(String.valueOf(thresholdLight)); // 设置光照阈值
}
private void setupListeners() {
private void setupListeners() { // 设置事件监听器
// 记录间隔滑块
seekRecordInterval.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
recordingInterval = (progress * 500) + 500; // 0.5秒到30秒
updateIntervalText();
updateIntervalText(); // 更新记录间隔值
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
public void onStartTrackingTouch(SeekBar seekBar) {} // 开始拖动
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
public void onStopTrackingTouch(SeekBar seekBar) {} // 停止拖动
});
// 保存按钮
buttonSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveSettings();
saveSettings(); // 保存设置
}
});
@ -119,7 +119,7 @@ public class SettingsActivity extends Activity {
buttonCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
finish(); // 结束当前Activity
}
});
@ -127,7 +127,7 @@ public class SettingsActivity extends Activity {
buttonReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resetToDefaults();
resetToDefaults(); // 重置为默认设置
}
});
@ -135,99 +135,99 @@ public class SettingsActivity extends Activity {
buttonPresetManager.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SettingsActivity.this, PresetManagerActivity.class);
startActivityForResult(intent, 100);
Intent intent = new Intent(SettingsActivity.this, PresetManagerActivity.class); // 创建Intent
startActivityForResult(intent, 100); // 启动Activity
}
});
}
private void updateIntervalText() {
if (recordingInterval < 1000) {
textIntervalValue.setText(String.format("%.1f 秒", recordingInterval / 1000.0));
private void updateIntervalText() { // 更新记录间隔值
if (recordingInterval < 1000) { // 如果记录间隔小于1000
textIntervalValue.setText(String.format("%.1f 秒", recordingInterval / 1000.0)); // 设置记录间隔值
} else {
textIntervalValue.setText(String.format("%d 秒", recordingInterval / 1000));
textIntervalValue.setText(String.format("%d 秒", recordingInterval / 1000)); // 设置记录间隔值
}
}
private void saveSettings() {
private void saveSettings() { // 保存设置
try {
// 获取用户输入
autoRecordEnabled = checkAutoRecord.isChecked();
thresholdTemp = Integer.parseInt(editThresholdTemp.getText().toString());
thresholdHumi = Integer.parseInt(editThresholdHumi.getText().toString());
thresholdDistance = Integer.parseInt(editThresholdDistance.getText().toString());
thresholdLight = Integer.parseInt(editThresholdLight.getText().toString());
thresholdTemp = Integer.parseInt(editThresholdTemp.getText().toString()); // 设置温度阈值
thresholdHumi = Integer.parseInt(editThresholdHumi.getText().toString()); // 设置湿度阈值
thresholdDistance = Integer.parseInt(editThresholdDistance.getText().toString()); // 设置距离阈值
thresholdLight = Integer.parseInt(editThresholdLight.getText().toString()); // 设置光照阈值
// 验证输入值
if (thresholdTemp < 0 || thresholdTemp > 100) {
Toast.makeText(this, "温度阈值应在0-100℃之间", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "温度阈值应在0-100℃之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return;
}
if (thresholdHumi < 0 || thresholdHumi > 100) {
Toast.makeText(this, "湿度阈值应在0-100%之间", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "湿度阈值应在0-100%之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return;
}
if (thresholdDistance < 0 || thresholdDistance > 500) {
Toast.makeText(this, "距离阈值应在0-500cm之间", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "距离阈值应在0-500cm之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return;
}
if (thresholdLight < 0 || thresholdLight > 100) {
Toast.makeText(this, "光照阈值应在0-100%之间", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "光照阈值应在0-100%之间", Toast.LENGTH_SHORT).show(); // 显示Toast
return;
}
// 保存到SharedPreferences
SharedPreferences prefs = getSharedPreferences("BattlefieldSettings", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("auto_record", autoRecordEnabled);
editor.putInt("recording_interval", recordingInterval);
editor.putInt("threshold_temp", thresholdTemp);
editor.putInt("threshold_humi", thresholdHumi);
editor.putInt("threshold_distance", thresholdDistance);
editor.putInt("threshold_light", thresholdLight);
editor.apply();
SharedPreferences prefs = getSharedPreferences("BattlefieldSettings", MODE_PRIVATE); // 获取SharedPreferences
SharedPreferences.Editor editor = prefs.edit(); // 获取Editor
editor.putBoolean("auto_record", autoRecordEnabled); // 设置自动记录
editor.putInt("recording_interval", recordingInterval); // 设置记录间隔
editor.putInt("threshold_temp", thresholdTemp); // 设置温度阈值
editor.putInt("threshold_humi", thresholdHumi); // 设置湿度阈值
editor.putInt("threshold_distance", thresholdDistance); // 设置距离阈值
editor.putInt("threshold_light", thresholdLight); // 设置光照阈值
editor.apply(); // 应用
// 返回结果
setResult(RESULT_OK);
Toast.makeText(this, "设置已保存", Toast.LENGTH_SHORT).show();
finish();
setResult(RESULT_OK); // 设置返回结果
Toast.makeText(this, "设置已保存", Toast.LENGTH_SHORT).show(); // 显示Toast
finish(); // 结束当前Activity
} catch (NumberFormatException e) {
Toast.makeText(this, "请输入有效的数值", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "请输入有效的数值", Toast.LENGTH_SHORT).show(); // 显示Toast
} catch (Exception e) {
Toast.makeText(this, "保存设置失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, "保存设置失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
private void resetToDefaults() {
autoRecordEnabled = true;
recordingInterval = 1000;
thresholdTemp = 45;
thresholdHumi = 35;
thresholdDistance = 10;
thresholdLight = 70;
private void resetToDefaults() { // 重置为默认设置
autoRecordEnabled = true; // 设置自动记录
recordingInterval = 1000; // 设置记录间隔
thresholdTemp = 45; // 设置温度阈值
thresholdHumi = 35; // 设置湿度阈值
thresholdDistance = 10; // 设置距离阈值
thresholdLight = 70; // 设置光照阈值
updateUI();
Toast.makeText(this, "已重置为默认设置", Toast.LENGTH_SHORT).show();
updateUI(); // 更新UI
Toast.makeText(this, "已重置为默认设置", Toast.LENGTH_SHORT).show(); // 显示Toast
}
/**
*
*/
public void onBackButtonClicked(View view) {
finish();
public void onBackButtonClicked(View view) { // 返回按钮点击事件
finish(); // 结束当前Activity
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data); // 处理Activity返回结果
if (requestCode == 100 && resultCode == RESULT_OK) {
if (requestCode == 100 && resultCode == RESULT_OK) { // 如果请求码为100且结果码为RESULT_OK
// 从预设方案管理器返回,重新加载设置
loadCurrentSettings();
updateUI();
Toast.makeText(this, "预设方案已应用,请保存设置", Toast.LENGTH_SHORT).show();
loadCurrentSettings(); // 重新加载设置
updateUI(); // 更新UI
Toast.makeText(this, "预设方案已应用,请保存设置", Toast.LENGTH_SHORT).show(); // 显示Toast
}
}
}

@ -19,46 +19,46 @@ import com.test.Bluetooh_736_2.Models.PresetScheme;
public class DatabaseHelper extends SQLiteOpenHelper {
// 数据库基本信息
private static final String DATABASE_NAME = "BattlefieldDetection.db";
private static final String DATABASE_NAME = "BattlefieldDetection.db"; // 数据库名称
private static final int DATABASE_VERSION = 3;
// 数据表名
private static final String TABLE_SENSOR_DATA = "sensor_data";
private static final String TABLE_PRESET_SCHEMES = "preset_schemes";
private static final String TABLE_SENSOR_DATA = "sensor_data"; // 传感器数据表名
private static final String TABLE_PRESET_SCHEMES = "preset_schemes"; // 预设方案表名
// 传感器数据表字段
private static final String COLUMN_ID = "id";
private static final String COLUMN_TIMESTAMP = "timestamp";
private static final String COLUMN_TEMPERATURE = "temperature";
private static final String COLUMN_HUMIDITY = "humidity";
private static final String COLUMN_LIGHT = "light";
private static final String COLUMN_DISTANCE = "distance";
private static final String COLUMN_TIME_MINUTES = "time_minutes";
private static final String COLUMN_MODE = "mode";
private static final String COLUMN_IS_TRIGGERED = "is_triggered";
private static final String COLUMN_TRIGGER_CONDITIONS = "trigger_conditions";
private static final String COLUMN_ID = "id"; // ID
private static final String COLUMN_TIMESTAMP = "timestamp"; // 时间戳
private static final String COLUMN_TEMPERATURE = "temperature"; // 温度
private static final String COLUMN_HUMIDITY = "humidity"; // 湿度
private static final String COLUMN_LIGHT = "light"; // 光照
private static final String COLUMN_DISTANCE = "distance"; // 距离
private static final String COLUMN_TIME_MINUTES = "time_minutes"; // 时间(分钟)
private static final String COLUMN_MODE = "mode"; // 模式
private static final String COLUMN_IS_TRIGGERED = "is_triggered"; // 触发状态
private static final String COLUMN_TRIGGER_CONDITIONS = "trigger_conditions"; // 触发条件
// 预设方案表字段
private static final String COLUMN_PRESET_ID = "preset_id";
private static final String COLUMN_PRESET_NAME = "preset_name";
private static final String COLUMN_PRESET_DESCRIPTION = "preset_description";
private static final String COLUMN_PRESET_TEMP_THRESHOLD = "temp_threshold";
private static final String COLUMN_PRESET_HUMI_THRESHOLD = "humi_threshold";
private static final String COLUMN_PRESET_DISTANCE_THRESHOLD = "distance_threshold";
private static final String COLUMN_PRESET_LIGHT_THRESHOLD = "light_threshold";
private static final String COLUMN_PRESET_RECORD_INTERVAL = "record_interval";
private static final String COLUMN_PRESET_AUTO_RECORD = "auto_record";
private static final String COLUMN_PRESET_CREATED_TIME = "created_time";
private static final String COLUMN_PRESET_IS_DEFAULT = "is_default";
private static final String COLUMN_PRESET_ID = "preset_id"; // ID
private static final String COLUMN_PRESET_NAME = "preset_name"; // 预设方案名称
private static final String COLUMN_PRESET_DESCRIPTION = "preset_description"; // 预设方案描述
private static final String COLUMN_PRESET_TEMP_THRESHOLD = "temp_threshold"; // 温度阈值
private static final String COLUMN_PRESET_HUMI_THRESHOLD = "humi_threshold"; // 湿度阈值
private static final String COLUMN_PRESET_DISTANCE_THRESHOLD = "distance_threshold"; // 距离阈值
private static final String COLUMN_PRESET_LIGHT_THRESHOLD = "light_threshold"; // 光照阈值
private static final String COLUMN_PRESET_RECORD_INTERVAL = "record_interval"; // 记录间隔
private static final String COLUMN_PRESET_AUTO_RECORD = "auto_record"; // 自动记录
private static final String COLUMN_PRESET_CREATED_TIME = "created_time"; // 创建时间
private static final String COLUMN_PRESET_IS_DEFAULT = "is_default"; // 是否默认
public DatabaseHelper(Context context) {
public DatabaseHelper(Context context) { // 构造函数
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
public void onCreate(SQLiteDatabase db) { // 创建数据库
// 创建传感器数据表
String CREATE_SENSOR_TABLE = "CREATE TABLE " + TABLE_SENSOR_DATA + "("
String CREATE_SENSOR_TABLE = "CREATE TABLE " + TABLE_SENSOR_DATA + "(" // 创建传感器数据表
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_TIMESTAMP + " TEXT NOT NULL,"
+ COLUMN_TEMPERATURE + " INTEGER,"
@ -73,7 +73,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
db.execSQL(CREATE_SENSOR_TABLE);
// 创建预设方案表
String CREATE_PRESET_TABLE = "CREATE TABLE " + TABLE_PRESET_SCHEMES + "("
String CREATE_PRESET_TABLE = "CREATE TABLE " + TABLE_PRESET_SCHEMES + "(" // 创建预设方案表
+ COLUMN_PRESET_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_PRESET_NAME + " TEXT NOT NULL,"
+ COLUMN_PRESET_DESCRIPTION + " TEXT,"
@ -93,40 +93,40 @@ public class DatabaseHelper extends SQLiteOpenHelper {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级数据库
// 升级数据库时处理版本兼容
if (oldVersion < 2) {
// 版本1 -> 版本2添加触发状态和触发条件字段
try {
db.execSQL("ALTER TABLE " + TABLE_SENSOR_DATA + " ADD COLUMN " + COLUMN_IS_TRIGGERED + " INTEGER DEFAULT 0");
db.execSQL("ALTER TABLE " + TABLE_SENSOR_DATA + " ADD COLUMN " + COLUMN_TRIGGER_CONDITIONS + " TEXT");
db.execSQL("ALTER TABLE " + TABLE_SENSOR_DATA + " ADD COLUMN " + COLUMN_IS_TRIGGERED + " INTEGER DEFAULT 0"); // 添加触发状态字段
db.execSQL("ALTER TABLE " + TABLE_SENSOR_DATA + " ADD COLUMN " + COLUMN_TRIGGER_CONDITIONS + " TEXT"); // 添加触发条件字段
Log.d("DatabaseHelper", "数据库升级成功:添加触发状态字段");
} catch (Exception e) {
Log.e("DatabaseHelper", "数据库升级失败,重新创建表", e);
// 如果升级失败,删除旧表并创建新表
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SENSOR_DATA);
onCreate(db);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SENSOR_DATA); // 删除旧表
onCreate(db); // 创建新表
}
}
if (oldVersion < 3) {
// 版本2 -> 版本3添加预设方案表
try {
String CREATE_PRESET_TABLE = "CREATE TABLE " + TABLE_PRESET_SCHEMES + "("
+ COLUMN_PRESET_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_PRESET_NAME + " TEXT NOT NULL,"
+ COLUMN_PRESET_DESCRIPTION + " TEXT,"
+ COLUMN_PRESET_TEMP_THRESHOLD + " INTEGER DEFAULT 45,"
+ COLUMN_PRESET_HUMI_THRESHOLD + " INTEGER DEFAULT 35,"
+ COLUMN_PRESET_DISTANCE_THRESHOLD + " INTEGER DEFAULT 10,"
+ COLUMN_PRESET_LIGHT_THRESHOLD + " INTEGER DEFAULT 70,"
+ COLUMN_PRESET_RECORD_INTERVAL + " INTEGER DEFAULT 1000,"
+ COLUMN_PRESET_AUTO_RECORD + " INTEGER DEFAULT 1,"
+ COLUMN_PRESET_CREATED_TIME + " TEXT NOT NULL,"
+ COLUMN_PRESET_IS_DEFAULT + " INTEGER DEFAULT 0"
String CREATE_PRESET_TABLE = "CREATE TABLE " + TABLE_PRESET_SCHEMES + "(" // 创建预设方案表
+ COLUMN_PRESET_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," // 预设方案ID
+ COLUMN_PRESET_NAME + " TEXT NOT NULL," // 预设方案名称
+ COLUMN_PRESET_DESCRIPTION + " TEXT," // 预设方案描述
+ COLUMN_PRESET_TEMP_THRESHOLD + " INTEGER DEFAULT 45," // 温度阈值
+ COLUMN_PRESET_HUMI_THRESHOLD + " INTEGER DEFAULT 35," // 湿度阈值
+ COLUMN_PRESET_DISTANCE_THRESHOLD + " INTEGER DEFAULT 10," // 距离阈值
+ COLUMN_PRESET_LIGHT_THRESHOLD + " INTEGER DEFAULT 70," // 光照阈值
+ COLUMN_PRESET_RECORD_INTERVAL + " INTEGER DEFAULT 1000," // 记录间隔
+ COLUMN_PRESET_AUTO_RECORD + " INTEGER DEFAULT 1," // 自动记录
+ COLUMN_PRESET_CREATED_TIME + " TEXT NOT NULL," // 创建时间
+ COLUMN_PRESET_IS_DEFAULT + " INTEGER DEFAULT 0" // 是否默认
+ ")";
db.execSQL(CREATE_PRESET_TABLE);
insertDefaultPresets(db);
db.execSQL(CREATE_PRESET_TABLE); // 执行创建预设方案表的SQL语句
insertDefaultPresets(db); // 插入默认预设方案
Log.d("DatabaseHelper", "数据库升级成功:添加预设方案表");
} catch (Exception e) {
Log.e("DatabaseHelper", "添加预设方案表失败", e);
@ -138,277 +138,277 @@ public class DatabaseHelper extends SQLiteOpenHelper {
*
*/
public long addSensorData(int temperature, int humidity, int light, int distance, int timeMinutes, String mode, boolean isTriggered, String triggerConditions) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_TIMESTAMP, getCurrentTimestamp());
values.put(COLUMN_TEMPERATURE, temperature);
values.put(COLUMN_HUMIDITY, humidity);
values.put(COLUMN_LIGHT, light);
values.put(COLUMN_DISTANCE, distance);
values.put(COLUMN_TIME_MINUTES, timeMinutes);
values.put(COLUMN_MODE, mode);
values.put(COLUMN_IS_TRIGGERED, isTriggered ? 1 : 0);
values.put(COLUMN_TRIGGER_CONDITIONS, triggerConditions);
long id = db.insert(TABLE_SENSOR_DATA, null, values);
db.close();
return id;
SQLiteDatabase db = this.getWritableDatabase(); // 获取可写数据库
ContentValues values = new ContentValues(); // 创建ContentValues对象
values.put(COLUMN_TIMESTAMP, getCurrentTimestamp()); // 设置时间戳
values.put(COLUMN_TEMPERATURE, temperature); // 设置温度
values.put(COLUMN_HUMIDITY, humidity); // 设置湿度
values.put(COLUMN_LIGHT, light); // 设置光照
values.put(COLUMN_DISTANCE, distance); // 设置距离
values.put(COLUMN_TIME_MINUTES, timeMinutes); // 设置时间(分钟)
values.put(COLUMN_MODE, mode); // 设置模式
values.put(COLUMN_IS_TRIGGERED, isTriggered ? 1 : 0); // 设置触发状态
values.put(COLUMN_TRIGGER_CONDITIONS, triggerConditions); // 设置触发条件
long id = db.insert(TABLE_SENSOR_DATA, null, values); // 插入数据
db.close(); // 关闭数据库
return id; // 返回ID
}
/**
*
*/
public long addSensorData(int temperature, int humidity, int light, int distance, int timeMinutes, String mode) {
return addSensorData(temperature, humidity, light, distance, timeMinutes, mode, false, "");
public long addSensorData(int temperature, int humidity, int light, int distance, int timeMinutes, String mode) { // 添加传感器数据记录(兼容旧版本)
return addSensorData(temperature, humidity, light, distance, timeMinutes, mode, false, ""); // 调用添加传感器数据记录的方法
}
/**
*
*/
public List<SensorData> getAllSensorData() {
List<SensorData> dataList = new ArrayList<>();
String selectQuery = "SELECT * FROM " + TABLE_SENSOR_DATA + " ORDER BY " + COLUMN_TIMESTAMP + " DESC";
public List<SensorData> getAllSensorData() { // 获取所有传感器数据
List<SensorData> dataList = new ArrayList<>(); // 创建SensorData列表
String selectQuery = "SELECT * FROM " + TABLE_SENSOR_DATA + " ORDER BY " + COLUMN_TIMESTAMP + " DESC"; // 创建查询语句
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.rawQuery(selectQuery, null); // 执行查询
if (cursor.moveToFirst()) {
do {
SensorData data = createSensorDataFromCursor(cursor);
dataList.add(data);
SensorData data = createSensorDataFromCursor(cursor); // 创建SensorData对象
dataList.add(data); // 添加到列表
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return dataList;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return dataList; // 返回数据列表
}
/**
* N
*/
public List<SensorData> getRecentData(int limit) {
List<SensorData> dataList = new ArrayList<>();
String selectQuery = "SELECT * FROM " + TABLE_SENSOR_DATA + " ORDER BY " + COLUMN_TIMESTAMP + " DESC LIMIT " + limit;
public List<SensorData> getRecentData(int limit) { // 获取最近N条记录
List<SensorData> dataList = new ArrayList<>(); // 创建SensorData列表
String selectQuery = "SELECT * FROM " + TABLE_SENSOR_DATA + " ORDER BY " + COLUMN_TIMESTAMP + " DESC LIMIT " + limit; // 创建查询语句
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.rawQuery(selectQuery, null); // 执行查询
if (cursor.moveToFirst()) {
do {
SensorData data = createSensorDataFromCursor(cursor);
dataList.add(data);
SensorData data = createSensorDataFromCursor(cursor); // 创建SensorData对象
dataList.add(data); // 添加到列表
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return dataList;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return dataList; // 返回数据列表
}
/**
*
*/
public List<SensorData> getDataByDateRange(String startDate, String endDate) {
List<SensorData> dataList = new ArrayList<>();
public List<SensorData> getDataByDateRange(String startDate, String endDate) { // 获取指定日期范围的数据
List<SensorData> dataList = new ArrayList<>(); // 创建SensorData列表
String selectQuery = "SELECT * FROM " + TABLE_SENSOR_DATA +
" WHERE " + COLUMN_TIMESTAMP + " BETWEEN '" + startDate + "' AND '" + endDate + "'" +
" WHERE " + COLUMN_TIMESTAMP + " BETWEEN '" + startDate + "' AND '" + endDate + "'" + // 创建查询语句
" ORDER BY " + COLUMN_TIMESTAMP + " ASC";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.rawQuery(selectQuery, null); // 执行查询
if (cursor.moveToFirst()) {
do {
SensorData data = createSensorDataFromCursor(cursor);
dataList.add(data);
SensorData data = createSensorDataFromCursor(cursor); // 创建SensorData对象
dataList.add(data); // 添加到列表
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return dataList;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return dataList; // 返回数据列表
}
/**
*
*/
public List<SensorData> getDataByTriggerStatus(boolean isTriggered) {
List<SensorData> dataList = new ArrayList<>();
public List<SensorData> getDataByTriggerStatus(boolean isTriggered) { // 按触发状态筛选数据
List<SensorData> dataList = new ArrayList<>(); // 创建SensorData列表
String selectQuery = "SELECT * FROM " + TABLE_SENSOR_DATA +
" WHERE " + COLUMN_IS_TRIGGERED + " = ?" +
" WHERE " + COLUMN_IS_TRIGGERED + " = ?" + // 创建查询语句
" ORDER BY " + COLUMN_TIMESTAMP + " DESC";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, new String[]{isTriggered ? "1" : "0"});
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.rawQuery(selectQuery, new String[]{isTriggered ? "1" : "0"}); // 执行查询
if (cursor.moveToFirst()) {
do {
SensorData data = createSensorDataFromCursor(cursor);
dataList.add(data);
SensorData data = createSensorDataFromCursor(cursor); // 创建SensorData对象
dataList.add(data); // 添加到列表
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return dataList;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return dataList; // 返回数据列表
}
/**
*
*/
public List<SensorData> getDataByDateRangeAndTriggerStatus(String startDate, String endDate, Boolean isTriggered) {
List<SensorData> dataList = new ArrayList<>();
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("SELECT * FROM ").append(TABLE_SENSOR_DATA)
public List<SensorData> getDataByDateRangeAndTriggerStatus(String startDate, String endDate, Boolean isTriggered) { // 按时间区段和触发状态筛选数据
List<SensorData> dataList = new ArrayList<>(); // 创建SensorData列表
StringBuilder queryBuilder = new StringBuilder(); // 创建StringBuilder对象
queryBuilder.append("SELECT * FROM ").append(TABLE_SENSOR_DATA) // 创建查询语句
.append(" WHERE ").append(COLUMN_TIMESTAMP)
.append(" BETWEEN '").append(startDate).append("' AND '").append(endDate).append("'");
.append(" BETWEEN '").append(startDate).append("' AND '").append(endDate).append("'"); // 创建查询语句
if (isTriggered != null) {
if (isTriggered != null) { // 如果触发状态不为空
queryBuilder.append(" AND ").append(COLUMN_IS_TRIGGERED).append(" = ").append(isTriggered ? "1" : "0");
}
queryBuilder.append(" ORDER BY ").append(COLUMN_TIMESTAMP).append(" ASC");
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(queryBuilder.toString(), null);
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.rawQuery(queryBuilder.toString(), null); // 执行查询
if (cursor.moveToFirst()) {
do {
SensorData data = createSensorDataFromCursor(cursor);
dataList.add(data);
SensorData data = createSensorDataFromCursor(cursor); // 创建SensorData对象
dataList.add(data); // 添加到列表
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return dataList;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return dataList; // 返回数据列表
}
/**
*
*/
public DataStatistics getDataStatistics() {
DataStatistics stats = new DataStatistics();
SQLiteDatabase db = this.getReadableDatabase();
public DataStatistics getDataStatistics() { // 获取数据统计信息
DataStatistics stats = new DataStatistics(); // 创建DataStatistics对象
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
// 获取总记录数
Cursor countCursor = db.rawQuery("SELECT COUNT(*) FROM " + TABLE_SENSOR_DATA, null);
if (countCursor.moveToFirst()) {
stats.setTotalRecords(countCursor.getInt(0));
Cursor countCursor = db.rawQuery("SELECT COUNT(*) FROM " + TABLE_SENSOR_DATA, null); // 执行查询
if (countCursor.moveToFirst()) { // 如果游标移动到第一行
stats.setTotalRecords(countCursor.getInt(0)); // 设置总记录数
}
countCursor.close();
countCursor.close(); // 关闭游标
// 获取温度统计
Cursor tempCursor = db.rawQuery("SELECT MIN(" + COLUMN_TEMPERATURE + "), MAX(" + COLUMN_TEMPERATURE + "), AVG(" + COLUMN_TEMPERATURE + ") FROM " + TABLE_SENSOR_DATA, null);
if (tempCursor.moveToFirst()) {
stats.setMinTemperature(tempCursor.getInt(0));
stats.setMaxTemperature(tempCursor.getInt(1));
stats.setAvgTemperature(tempCursor.getFloat(2));
Cursor tempCursor = db.rawQuery("SELECT MIN(" + COLUMN_TEMPERATURE + "), MAX(" + COLUMN_TEMPERATURE + "), AVG(" + COLUMN_TEMPERATURE + ") FROM " + TABLE_SENSOR_DATA, null); // 执行查询
if (tempCursor.moveToFirst()) { // 如果游标移动到第一行
stats.setMinTemperature(tempCursor.getInt(0)); // 设置最小温度
stats.setMaxTemperature(tempCursor.getInt(1)); // 设置最大温度
stats.setAvgTemperature(tempCursor.getFloat(2)); // 设置平均温度
}
tempCursor.close();
tempCursor.close(); // 关闭游标
// 获取湿度统计
Cursor humiCursor = db.rawQuery("SELECT MIN(" + COLUMN_HUMIDITY + "), MAX(" + COLUMN_HUMIDITY + "), AVG(" + COLUMN_HUMIDITY + ") FROM " + TABLE_SENSOR_DATA, null);
if (humiCursor.moveToFirst()) {
stats.setMinHumidity(humiCursor.getInt(0));
stats.setMaxHumidity(humiCursor.getInt(1));
stats.setAvgHumidity(humiCursor.getFloat(2));
Cursor humiCursor = db.rawQuery("SELECT MIN(" + COLUMN_HUMIDITY + "), MAX(" + COLUMN_HUMIDITY + "), AVG(" + COLUMN_HUMIDITY + ") FROM " + TABLE_SENSOR_DATA, null); // 执行查询
if (humiCursor.moveToFirst()) { // 如果游标移动到第一行
stats.setMinHumidity(humiCursor.getInt(0)); // 设置最小湿度
stats.setMaxHumidity(humiCursor.getInt(1)); // 设置最大湿度
stats.setAvgHumidity(humiCursor.getFloat(2)); // 设置平均湿度
}
humiCursor.close();
humiCursor.close(); // 关闭游标
// 获取光照统计
Cursor lightCursor = db.rawQuery("SELECT MIN(" + COLUMN_LIGHT + "), MAX(" + COLUMN_LIGHT + "), AVG(" + COLUMN_LIGHT + ") FROM " + TABLE_SENSOR_DATA, null);
if (lightCursor.moveToFirst()) {
stats.setMinLight(lightCursor.getInt(0));
stats.setMaxLight(lightCursor.getInt(1));
stats.setAvgLight(lightCursor.getFloat(2));
Cursor lightCursor = db.rawQuery("SELECT MIN(" + COLUMN_LIGHT + "), MAX(" + COLUMN_LIGHT + "), AVG(" + COLUMN_LIGHT + ") FROM " + TABLE_SENSOR_DATA, null); // 执行查询
if (lightCursor.moveToFirst()) { // 如果游标移动到第一行
stats.setMinLight(lightCursor.getInt(0)); // 设置最小光照
stats.setMaxLight(lightCursor.getInt(1)); // 设置最大光照
stats.setAvgLight(lightCursor.getFloat(2)); // 设置平均光照
}
lightCursor.close();
lightCursor.close(); // 关闭游标
db.close();
return stats;
db.close(); // 关闭数据库
return stats; // 返回数据统计信息
}
/**
*
*/
public int deleteOldData(int daysToKeep) {
SQLiteDatabase db = this.getWritableDatabase();
public int deleteOldData(int daysToKeep) { // 删除指定天数之前的数据
SQLiteDatabase db = this.getWritableDatabase(); // 获取可写数据库
// 计算删除时间点
long cutoffTime = System.currentTimeMillis() - (daysToKeep * 24 * 60 * 60 * 1000L);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String cutoffDate = sdf.format(new Date(cutoffTime));
long cutoffTime = System.currentTimeMillis() - (daysToKeep * 24 * 60 * 60 * 1000L); // 计算删除时间点
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); // 创建SimpleDateFormat对象
String cutoffDate = sdf.format(new Date(cutoffTime)); // 计算删除时间点
int deletedRows = db.delete(TABLE_SENSOR_DATA, COLUMN_TIMESTAMP + " < ?", new String[]{cutoffDate});
db.close();
return deletedRows;
int deletedRows = db.delete(TABLE_SENSOR_DATA, COLUMN_TIMESTAMP + " < ?", new String[]{cutoffDate}); // 删除数据
db.close(); // 关闭数据库
return deletedRows; // 返回删除的行数
}
/**
*
*/
public void clearAllData() {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_SENSOR_DATA, null, null);
db.close();
public void clearAllData() { // 清空所有数据
SQLiteDatabase db = this.getWritableDatabase(); // 获取可写数据库
db.delete(TABLE_SENSOR_DATA, null, null); // 删除所有数据
db.close(); // 关闭数据库
}
/**
* CursorSensorData
*/
private SensorData createSensorDataFromCursor(Cursor cursor) {
SensorData data = new SensorData();
data.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_ID)));
data.setTimestamp(cursor.getString(cursor.getColumnIndex(COLUMN_TIMESTAMP)));
data.setTemperature(cursor.getInt(cursor.getColumnIndex(COLUMN_TEMPERATURE)));
data.setHumidity(cursor.getInt(cursor.getColumnIndex(COLUMN_HUMIDITY)));
data.setLight(cursor.getInt(cursor.getColumnIndex(COLUMN_LIGHT)));
data.setDistance(cursor.getInt(cursor.getColumnIndex(COLUMN_DISTANCE)));
data.setTimeMinutes(cursor.getInt(cursor.getColumnIndex(COLUMN_TIME_MINUTES)));
data.setMode(cursor.getString(cursor.getColumnIndex(COLUMN_MODE)));
private SensorData createSensorDataFromCursor(Cursor cursor) { // 从Cursor创建SensorData对象
SensorData data = new SensorData(); // 创建SensorData对象
data.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_ID))); // 设置ID
data.setTimestamp(cursor.getString(cursor.getColumnIndex(COLUMN_TIMESTAMP))); // 设置时间戳
data.setTemperature(cursor.getInt(cursor.getColumnIndex(COLUMN_TEMPERATURE))); // 设置温度
data.setHumidity(cursor.getInt(cursor.getColumnIndex(COLUMN_HUMIDITY))); // 设置湿度
data.setLight(cursor.getInt(cursor.getColumnIndex(COLUMN_LIGHT))); // 设置光照
data.setDistance(cursor.getInt(cursor.getColumnIndex(COLUMN_DISTANCE))); // 设置距离
data.setTimeMinutes(cursor.getInt(cursor.getColumnIndex(COLUMN_TIME_MINUTES))); // 设置时间(分钟)
data.setMode(cursor.getString(cursor.getColumnIndex(COLUMN_MODE))); // 设置模式
// 处理新增字段(兼容旧数据)
int triggeredColumnIndex = cursor.getColumnIndex(COLUMN_IS_TRIGGERED);
if (triggeredColumnIndex >= 0) {
data.setTriggered(cursor.getInt(triggeredColumnIndex) == 1);
int triggeredColumnIndex = cursor.getColumnIndex(COLUMN_IS_TRIGGERED); // 获取触发状态列索引
if (triggeredColumnIndex >= 0) { // 如果触发状态列存在
data.setTriggered(cursor.getInt(triggeredColumnIndex) == 1); // 设置触发状态
} else {
data.setTriggered(false);
data.setTriggered(false); // 设置触发状态
}
int conditionsColumnIndex = cursor.getColumnIndex(COLUMN_TRIGGER_CONDITIONS);
if (conditionsColumnIndex >= 0) {
data.setTriggerConditions(cursor.getString(conditionsColumnIndex));
int conditionsColumnIndex = cursor.getColumnIndex(COLUMN_TRIGGER_CONDITIONS); // 获取触发条件列索引
if (conditionsColumnIndex >= 0) { // 如果触发条件列存在
data.setTriggerConditions(cursor.getString(conditionsColumnIndex)); // 设置触发条件
} else {
data.setTriggerConditions("");
data.setTriggerConditions(""); // 设置触发条件
}
return data;
return data; // 返回SensorData对象
}
/**
*
*/
private String getCurrentTimestamp() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
return sdf.format(new Date());
private String getCurrentTimestamp() { // 获取当前时间戳
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); // 创建SimpleDateFormat对象
return sdf.format(new Date()); // 返回当前时间戳
}
/**
*
*/
public int getRecordCount() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM " + TABLE_SENSOR_DATA, null);
int count = 0;
if (cursor.moveToFirst()) {
count = cursor.getInt(0);
public int getRecordCount() { // 获取数据库记录总数
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM " + TABLE_SENSOR_DATA, null); // 执行查询
int count = 0; // 记录总数
if (cursor.moveToFirst()) { // 如果游标移动到第一行
count = cursor.getInt(0); // 设置记录总数
}
cursor.close();
db.close();
return count;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return count; // 返回记录总数
}
// ========== 预设方案管理方法 ==========
@ -416,163 +416,163 @@ public class DatabaseHelper extends SQLiteOpenHelper {
/**
*
*/
private void insertDefaultPresets(SQLiteDatabase db) {
ContentValues values = new ContentValues();
private void insertDefaultPresets(SQLiteDatabase db) { // 插入默认预设方案
ContentValues values = new ContentValues(); // 创建ContentValues对象
// 默认方案1普通检测
values.put(COLUMN_PRESET_NAME, "普通检测");
values.put(COLUMN_PRESET_DESCRIPTION, "适用于一般环境的检测设置");
values.put(COLUMN_PRESET_TEMP_THRESHOLD, 45);
values.put(COLUMN_PRESET_HUMI_THRESHOLD, 35);
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, 10);
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, 70);
values.put(COLUMN_PRESET_RECORD_INTERVAL, 1000);
values.put(COLUMN_PRESET_AUTO_RECORD, 1);
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp());
values.put(COLUMN_PRESET_IS_DEFAULT, 1);
db.insert(TABLE_PRESET_SCHEMES, null, values);
values.put(COLUMN_PRESET_NAME, "普通检测"); // 设置预设方案名称
values.put(COLUMN_PRESET_DESCRIPTION, "适用于一般环境的检测设置"); // 设置预设方案描述
values.put(COLUMN_PRESET_TEMP_THRESHOLD, 45); // 设置温度阈值
values.put(COLUMN_PRESET_HUMI_THRESHOLD, 35); // 设置湿度阈值
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, 10); // 设置距离阈值
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, 70); // 设置光照阈值
values.put(COLUMN_PRESET_RECORD_INTERVAL, 1000); // 设置记录间隔
values.put(COLUMN_PRESET_AUTO_RECORD, 1); // 设置自动记录
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp()); // 设置创建时间
values.put(COLUMN_PRESET_IS_DEFAULT, 1); // 设置是否默认
db.insert(TABLE_PRESET_SCHEMES, null, values); // 插入数据
// 默认方案2高精度检测
values.clear();
values.put(COLUMN_PRESET_NAME, "高精度检测");
values.put(COLUMN_PRESET_DESCRIPTION, "高频率记录,适用于精密监控");
values.put(COLUMN_PRESET_TEMP_THRESHOLD, 40);
values.put(COLUMN_PRESET_HUMI_THRESHOLD, 30);
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, 5);
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, 80);
values.put(COLUMN_PRESET_RECORD_INTERVAL, 500);
values.put(COLUMN_PRESET_AUTO_RECORD, 1);
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp());
values.put(COLUMN_PRESET_IS_DEFAULT, 1);
db.insert(TABLE_PRESET_SCHEMES, null, values);
values.clear(); // 清空ContentValues对象
values.put(COLUMN_PRESET_NAME, "高精度检测"); // 设置预设方案名称
values.put(COLUMN_PRESET_DESCRIPTION, "高频率记录,适用于精密监控"); // 设置预设方案描述
values.put(COLUMN_PRESET_TEMP_THRESHOLD, 40); // 设置温度阈值
values.put(COLUMN_PRESET_HUMI_THRESHOLD, 30); // 设置湿度阈值
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, 5); // 设置距离阈值
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, 80); // 设置光照阈值
values.put(COLUMN_PRESET_RECORD_INTERVAL, 500); // 设置记录间隔
values.put(COLUMN_PRESET_AUTO_RECORD, 1); // 设置自动记录
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp()); // 设置创建时间
values.put(COLUMN_PRESET_IS_DEFAULT, 1); // 设置是否默认
db.insert(TABLE_PRESET_SCHEMES, null, values); // 插入数据
// 默认方案3节能检测
values.clear();
values.put(COLUMN_PRESET_NAME, "节能检测");
values.put(COLUMN_PRESET_DESCRIPTION, "低频率记录,适用于长期监控");
values.put(COLUMN_PRESET_TEMP_THRESHOLD, 50);
values.put(COLUMN_PRESET_HUMI_THRESHOLD, 40);
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, 15);
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, 60);
values.put(COLUMN_PRESET_RECORD_INTERVAL, 5000);
values.put(COLUMN_PRESET_AUTO_RECORD, 1);
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp());
values.put(COLUMN_PRESET_IS_DEFAULT, 1);
db.insert(TABLE_PRESET_SCHEMES, null, values);
values.clear(); // 清空ContentValues对象
values.put(COLUMN_PRESET_NAME, "节能检测"); // 设置预设方案名称
values.put(COLUMN_PRESET_DESCRIPTION, "低频率记录,适用于长期监控"); // 设置预设方案描述
values.put(COLUMN_PRESET_TEMP_THRESHOLD, 50); // 设置温度阈值
values.put(COLUMN_PRESET_HUMI_THRESHOLD, 40); // 设置湿度阈值
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, 15); // 设置距离阈值
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, 60); // 设置光照阈值
values.put(COLUMN_PRESET_RECORD_INTERVAL, 5000); // 设置记录间隔
values.put(COLUMN_PRESET_AUTO_RECORD, 1); // 设置自动记录
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp()); // 设置创建时间
values.put(COLUMN_PRESET_IS_DEFAULT, 1); // 设置是否默认
db.insert(TABLE_PRESET_SCHEMES, null, values); // 插入数据
}
/**
*
*/
public List<PresetScheme> getAllPresetSchemes() {
List<PresetScheme> schemes = new ArrayList<>();
String selectQuery = "SELECT * FROM " + TABLE_PRESET_SCHEMES + " ORDER BY " + COLUMN_PRESET_IS_DEFAULT + " DESC, " + COLUMN_PRESET_CREATED_TIME + " DESC";
public List<PresetScheme> getAllPresetSchemes() { // 获取所有预设方案
List<PresetScheme> schemes = new ArrayList<>(); // 创建PresetScheme列表
String selectQuery = "SELECT * FROM " + TABLE_PRESET_SCHEMES + " ORDER BY " + COLUMN_PRESET_IS_DEFAULT + " DESC, " + COLUMN_PRESET_CREATED_TIME + " DESC"; // 创建查询语句
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.rawQuery(selectQuery, null); // 执行查询
if (cursor.moveToFirst()) {
do {
PresetScheme scheme = createPresetSchemeFromCursor(cursor);
schemes.add(scheme);
} while (cursor.moveToNext());
PresetScheme scheme = createPresetSchemeFromCursor(cursor); // 创建PresetScheme对象
schemes.add(scheme); // 添加到列表
} while (cursor.moveToNext()); // 移动到下一行
}
cursor.close();
db.close();
return schemes;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return schemes; // 返回预设方案列表
}
/**
*
*/
public long addPresetScheme(String name, String description, int tempThreshold, int humiThreshold,
int distanceThreshold, int lightThreshold, int recordInterval, boolean autoRecord) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_PRESET_NAME, name);
values.put(COLUMN_PRESET_DESCRIPTION, description);
values.put(COLUMN_PRESET_TEMP_THRESHOLD, tempThreshold);
values.put(COLUMN_PRESET_HUMI_THRESHOLD, humiThreshold);
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, distanceThreshold);
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, lightThreshold);
values.put(COLUMN_PRESET_RECORD_INTERVAL, recordInterval);
values.put(COLUMN_PRESET_AUTO_RECORD, autoRecord ? 1 : 0);
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp());
values.put(COLUMN_PRESET_IS_DEFAULT, 0);
long id = db.insert(TABLE_PRESET_SCHEMES, null, values);
db.close();
return id;
int distanceThreshold, int lightThreshold, int recordInterval, boolean autoRecord) { // 添加预设方案
SQLiteDatabase db = this.getWritableDatabase(); // 获取可写数据库
ContentValues values = new ContentValues(); // 创建ContentValues对象
values.put(COLUMN_PRESET_NAME, name); // 设置预设方案名称
values.put(COLUMN_PRESET_DESCRIPTION, description); // 设置预设方案描述
values.put(COLUMN_PRESET_TEMP_THRESHOLD, tempThreshold); // 设置温度阈值
values.put(COLUMN_PRESET_HUMI_THRESHOLD, humiThreshold); // 设置湿度阈值
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, distanceThreshold); // 设置距离阈值
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, lightThreshold); // 设置光照阈值
values.put(COLUMN_PRESET_RECORD_INTERVAL, recordInterval); // 设置记录间隔
values.put(COLUMN_PRESET_AUTO_RECORD, autoRecord ? 1 : 0); // 设置自动记录
values.put(COLUMN_PRESET_CREATED_TIME, getCurrentTimestamp()); // 设置创建时间
values.put(COLUMN_PRESET_IS_DEFAULT, 0); // 设置是否默认
long id = db.insert(TABLE_PRESET_SCHEMES, null, values); // 插入数据
db.close(); // 关闭数据库
return id; // 返回ID
}
/**
*
*/
public int updatePresetScheme(long id, String name, String description, int tempThreshold, int humiThreshold,
int distanceThreshold, int lightThreshold, int recordInterval, boolean autoRecord) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_PRESET_NAME, name);
values.put(COLUMN_PRESET_DESCRIPTION, description);
values.put(COLUMN_PRESET_TEMP_THRESHOLD, tempThreshold);
values.put(COLUMN_PRESET_HUMI_THRESHOLD, humiThreshold);
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, distanceThreshold);
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, lightThreshold);
values.put(COLUMN_PRESET_RECORD_INTERVAL, recordInterval);
values.put(COLUMN_PRESET_AUTO_RECORD, autoRecord ? 1 : 0);
int rowsAffected = db.update(TABLE_PRESET_SCHEMES, values, COLUMN_PRESET_ID + " = ?", new String[]{String.valueOf(id)});
db.close();
return rowsAffected;
int distanceThreshold, int lightThreshold, int recordInterval, boolean autoRecord) { // 更新预设方案
SQLiteDatabase db = this.getWritableDatabase(); // 获取可写数据库
ContentValues values = new ContentValues(); // 创建ContentValues对象
values.put(COLUMN_PRESET_NAME, name); // 设置预设方案名称
values.put(COLUMN_PRESET_DESCRIPTION, description); // 设置预设方案描述
values.put(COLUMN_PRESET_TEMP_THRESHOLD, tempThreshold); // 设置温度阈值
values.put(COLUMN_PRESET_HUMI_THRESHOLD, humiThreshold); // 设置湿度阈值
values.put(COLUMN_PRESET_DISTANCE_THRESHOLD, distanceThreshold); // 设置距离阈值
values.put(COLUMN_PRESET_LIGHT_THRESHOLD, lightThreshold); // 设置光照阈值
values.put(COLUMN_PRESET_RECORD_INTERVAL, recordInterval); // 设置记录间隔
values.put(COLUMN_PRESET_AUTO_RECORD, autoRecord ? 1 : 0); // 设置自动记录
int rowsAffected = db.update(TABLE_PRESET_SCHEMES, values, COLUMN_PRESET_ID + " = ?", new String[]{String.valueOf(id)}); // 更新数据
db.close(); // 关闭数据库
return rowsAffected; // 返回受影响的行数
}
/**
*
*/
public int deletePresetScheme(long id) {
SQLiteDatabase db = this.getWritableDatabase();
int rowsAffected = db.delete(TABLE_PRESET_SCHEMES, COLUMN_PRESET_ID + " = ? AND " + COLUMN_PRESET_IS_DEFAULT + " = 0", new String[]{String.valueOf(id)});
db.close();
return rowsAffected;
public int deletePresetScheme(long id) { // 删除预设方案
SQLiteDatabase db = this.getWritableDatabase(); // 获取可写数据库
int rowsAffected = db.delete(TABLE_PRESET_SCHEMES, COLUMN_PRESET_ID + " = ? AND " + COLUMN_PRESET_IS_DEFAULT + " = 0", new String[]{String.valueOf(id)}); // 删除数据
db.close(); // 关闭数据库
return rowsAffected; // 返回受影响的行数
}
/**
* ID
*/
public PresetScheme getPresetSchemeById(long id) {
SQLiteDatabase db = this.getReadableDatabase();
public PresetScheme getPresetSchemeById(long id) { // 根据ID获取预设方案
SQLiteDatabase db = this.getReadableDatabase(); // 获取可读数据库
Cursor cursor = db.query(TABLE_PRESET_SCHEMES, null, COLUMN_PRESET_ID + " = ?",
new String[]{String.valueOf(id)}, null, null, null);
new String[]{String.valueOf(id)}, null, null, null); // 执行查询
PresetScheme scheme = null;
if (cursor.moveToFirst()) {
scheme = createPresetSchemeFromCursor(cursor);
PresetScheme scheme = null; // 创建PresetScheme对象
if (cursor.moveToFirst()) { // 如果游标移动到第一行
scheme = createPresetSchemeFromCursor(cursor); // 创建PresetScheme对象
}
cursor.close();
db.close();
return scheme;
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return scheme; // 返回PresetScheme对象
}
/**
* CursorPresetScheme
*/
private PresetScheme createPresetSchemeFromCursor(Cursor cursor) {
PresetScheme scheme = new PresetScheme();
scheme.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_PRESET_ID)));
scheme.setName(cursor.getString(cursor.getColumnIndex(COLUMN_PRESET_NAME)));
scheme.setDescription(cursor.getString(cursor.getColumnIndex(COLUMN_PRESET_DESCRIPTION)));
scheme.setTempThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_TEMP_THRESHOLD)));
scheme.setHumiThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_HUMI_THRESHOLD)));
scheme.setDistanceThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_DISTANCE_THRESHOLD)));
scheme.setLightThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_LIGHT_THRESHOLD)));
scheme.setRecordInterval(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_RECORD_INTERVAL)));
scheme.setAutoRecord(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_AUTO_RECORD)) == 1);
scheme.setCreatedTime(cursor.getString(cursor.getColumnIndex(COLUMN_PRESET_CREATED_TIME)));
scheme.setIsDefault(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_IS_DEFAULT)) == 1);
return scheme;
private PresetScheme createPresetSchemeFromCursor(Cursor cursor) { // 从Cursor创建PresetScheme对象
PresetScheme scheme = new PresetScheme(); // 创建PresetScheme对象
scheme.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_PRESET_ID))); // 设置ID
scheme.setName(cursor.getString(cursor.getColumnIndex(COLUMN_PRESET_NAME))); // 设置名称
scheme.setDescription(cursor.getString(cursor.getColumnIndex(COLUMN_PRESET_DESCRIPTION))); // 设置描述
scheme.setTempThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_TEMP_THRESHOLD))); // 设置温度阈值
scheme.setHumiThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_HUMI_THRESHOLD))); // 设置湿度阈值
scheme.setDistanceThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_DISTANCE_THRESHOLD))); // 设置距离阈值
scheme.setLightThreshold(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_LIGHT_THRESHOLD))); // 设置光照阈值
scheme.setRecordInterval(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_RECORD_INTERVAL))); // 设置记录间隔
scheme.setAutoRecord(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_AUTO_RECORD)) == 1); // 设置自动记录
scheme.setCreatedTime(cursor.getString(cursor.getColumnIndex(COLUMN_PRESET_CREATED_TIME))); // 设置创建时间
scheme.setIsDefault(cursor.getInt(cursor.getColumnIndex(COLUMN_PRESET_IS_DEFAULT)) == 1); // 设置是否默认
return scheme; // 返回PresetScheme对象
}
}

@ -3,110 +3,110 @@ package com.test.Bluetooh_736_2.Models;
/**
*
*/
public class DataStatistics {
private int totalRecords;
public class DataStatistics { // 数据统计模型类
private int totalRecords; // 总记录数
// 温度统计
private int minTemperature;
private int maxTemperature;
private float avgTemperature;
private int minTemperature; // 最小温度
private int maxTemperature; // 最大温度
private float avgTemperature; // 平均温度
// 湿度统计
private int minHumidity;
private int maxHumidity;
private float avgHumidity;
private int minHumidity; // 最小湿度
private int maxHumidity; // 最大湿度
private float avgHumidity; // 平均湿度
// 光照统计
private int minLight;
private int maxLight;
private float avgLight;
private int minLight; // 最小光照
private int maxLight; // 最大光照
private float avgLight; // 平均光照
// 构造函数
public DataStatistics() {}
public DataStatistics() {} // 构造函数
// Getter 和 Setter 方法
public int getTotalRecords() {
return totalRecords;
public int getTotalRecords() { // 获取总记录数
return totalRecords; // 返回总记录数
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
public void setTotalRecords(int totalRecords) { // 设置总记录数
this.totalRecords = totalRecords; // 设置总记录数
}
public int getMinTemperature() {
return minTemperature;
public int getMinTemperature() { // 获取最小温度
return minTemperature; // 返回最小温度
}
public void setMinTemperature(int minTemperature) {
this.minTemperature = minTemperature;
public void setMinTemperature(int minTemperature) { // 设置最小温度
this.minTemperature = minTemperature; // 设置最小温度
}
public int getMaxTemperature() {
return maxTemperature;
public int getMaxTemperature() { // 获取最大温度
return maxTemperature; // 返回最大温度
}
public void setMaxTemperature(int maxTemperature) {
this.maxTemperature = maxTemperature;
public void setMaxTemperature(int maxTemperature) { // 设置最大温度
this.maxTemperature = maxTemperature; // 设置最大温度
}
public float getAvgTemperature() {
return avgTemperature;
public float getAvgTemperature() { // 获取平均温度
return avgTemperature; // 返回平均温度
}
public void setAvgTemperature(float avgTemperature) {
this.avgTemperature = avgTemperature;
public void setAvgTemperature(float avgTemperature) { // 设置平均温度
this.avgTemperature = avgTemperature; // 设置平均温度
}
public int getMinHumidity() {
return minHumidity;
public int getMinHumidity() { // 获取最小湿度
return minHumidity; // 返回最小湿度
}
public void setMinHumidity(int minHumidity) {
this.minHumidity = minHumidity;
public void setMinHumidity(int minHumidity) { // 设置最小湿度
this.minHumidity = minHumidity; // 设置最小湿度
}
public int getMaxHumidity() {
return maxHumidity;
public int getMaxHumidity() { // 获取最大湿度
return maxHumidity; // 返回最大湿度
}
public void setMaxHumidity(int maxHumidity) {
this.maxHumidity = maxHumidity;
public void setMaxHumidity(int maxHumidity) { // 设置最大湿度
this.maxHumidity = maxHumidity; // 设置最大湿度
}
public float getAvgHumidity() {
public float getAvgHumidity() { // 获取平均湿度
return avgHumidity;
}
public void setAvgHumidity(float avgHumidity) {
this.avgHumidity = avgHumidity;
this.avgHumidity = avgHumidity; // 设置平均湿度
}
public int getMinLight() {
return minLight;
public int getMinLight() { // 获取最小光照
return minLight; // 返回最小光照
}
public void setMinLight(int minLight) {
this.minLight = minLight;
public void setMinLight(int minLight) { // 设置最小光照
this.minLight = minLight; // 设置最小光照
}
public int getMaxLight() {
return maxLight;
public int getMaxLight() { // 获取最大光照
return maxLight; // 返回最大光照
}
public void setMaxLight(int maxLight) {
this.maxLight = maxLight;
public void setMaxLight(int maxLight) { // 设置最大光照
this.maxLight = maxLight; // 设置最大光照
}
public float getAvgLight() {
return avgLight;
public float getAvgLight() { // 获取平均光照
return avgLight; // 返回平均光照
}
public void setAvgLight(float avgLight) {
this.avgLight = avgLight;
public void setAvgLight(float avgLight) { // 设置平均光照
this.avgLight = avgLight; // 设置平均光照
}
@Override
public String toString() {
public String toString() { // 重写toString方法
return "DataStatistics{" +
"totalRecords=" + totalRecords +
", minTemperature=" + minTemperature +

@ -19,98 +19,98 @@ SensorData {
// 构造函数
public SensorData() {}
public SensorData(int temperature, int humidity, int light, int distance, int timeMinutes, String mode) {
public SensorData(int temperature, int humidity, int light, int distance, int timeMinutes, String mode) { // 构造函数
this.temperature = temperature;
this.humidity = humidity;
this.light = light;
this.distance = distance;
this.timeMinutes = timeMinutes;
this.mode = mode;
this.light = light; // 光照
this.distance = distance; // 距离
this.timeMinutes = timeMinutes; // 时间(分钟)
this.mode = mode; // 模式
}
// Getter 和 Setter 方法
public long getId() {
return id;
}
public void setId(long id) {
public void setId(long id) { // 设置ID
this.id = id;
}
public String getTimestamp() {
public String getTimestamp() { // 获取时间戳
return timestamp;
}
public void setTimestamp(String timestamp) {
public void setTimestamp(String timestamp) { // 设置时间戳
this.timestamp = timestamp;
}
public int getTemperature() {
public int getTemperature() { // 获取温度
return temperature;
}
public void setTemperature(int temperature) {
public void setTemperature(int temperature) { // 设置温度
this.temperature = temperature;
}
public int getHumidity() {
public int getHumidity() { // 获取湿度
return humidity;
}
public void setHumidity(int humidity) {
public void setHumidity(int humidity) { // 设置湿度
this.humidity = humidity;
}
public int getLight() {
public int getLight() { // 获取光照
return light;
}
public void setLight(int light) {
public void setLight(int light) { // 设置光照
this.light = light;
}
public int getDistance() {
public int getDistance() { // 获取距离
return distance;
}
public void setDistance(int distance) {
public void setDistance(int distance) { // 设置距离
this.distance = distance;
}
public int getTimeMinutes() {
public int getTimeMinutes() { // 获取时间(分钟)
return timeMinutes;
}
public void setTimeMinutes(int timeMinutes) {
public void setTimeMinutes(int timeMinutes) { // 设置时间(分钟)
this.timeMinutes = timeMinutes;
}
public String getMode() {
public String getMode() { // 获取模式
return mode;
}
public void setMode(String mode) {
public void setMode(String mode) { // 设置模式
this.mode = mode;
}
public boolean isTriggered() {
public boolean isTriggered() { // 获取触发状态
return isTriggered;
}
public void setTriggered(boolean triggered) {
public void setTriggered(boolean triggered) { // 设置触发状态
isTriggered = triggered;
}
public String getTriggerConditions() {
public String getTriggerConditions() { // 获取触发条件
return triggerConditions;
}
public void setTriggerConditions(String triggerConditions) {
public void setTriggerConditions(String triggerConditions) { // 设置触发条件
this.triggerConditions = triggerConditions;
}
@Override
public String toString() {
public String toString() { // 重写toString方法
return "SensorData{" +
"id=" + id +
", timestamp='" + timestamp + '\'' +

@ -0,0 +1,43 @@
# 战场检测系统包图
```
┌─────────────────────────────────────────────────────────────────┐
│ Activities Package │
│ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐│
│ │ MainActivity │ │ DeviceListActivity│ │ HistoryActivity ││
│ └──────────────────┘ └──────────────────┘ └─────────────────┘│
│ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐│
│ │ SettingsActivity │ │PresetManagerActivity│ │ChartAnalysisActivity││
│ └──────────────────┘ └──────────────────┘ └─────────────────┘│
└─────────────────────────────────────────────────────────────────┘
│ depends on
┌─────────────────────────────────────────────────────────────────┐
│ Database Package │
│ ┌──────────────────┐ │
│ │ DatabaseHelper │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ depends on
┌─────────────────────────────────────────────────────────────────┐
│ Models Package │
│ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐│
│ │ SensorData │ │ PresetScheme │ │ DataStatistics ││
│ └──────────────────┘ └──────────────────┘ └─────────────────┘│
└─────────────────────────────────────────────────────────────────┘
│ extends/implements
┌─────────────────────────────────────────────────────────────────┐
│ Android Framework │
│ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐│
│ │ Activity │ │ SQLiteOpenHelper │ │BluetoothAdapter ││
│ └──────────────────┘ └──────────────────┘ └─────────────────┘│
│ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐│
│ │SharedPreferences │ │ Handler │ │ Vibrator ││
│ └──────────────────┘ └──────────────────┘ └─────────────────┘│
└─────────────────────────────────────────────────────────────────┘
```
Loading…
Cancel
Save