android - 每周在特定日期重置数据库值的最佳方法(Android - Room)
问题描述
我正在开发一个具有每周功能的 Android 应用程序,也就是说,用户必须将一周中的每一天标记为完成。这个值是我数据库上的一个布尔值,初始化为 false,并在用户单击复选框时设置为 true。一切正常。
但我的问题是,每次新的一周开始时,我都需要在一周的所有 7 天里将这个布尔值“重置”为 false。我不需要过去几周的记录。重要的是实际的一周(周日到周六)。
这是一个非常简单的任务,我只需要这样做:
for(WeekDay day: dao.getWeekDays()){
day.setDone(false);
dao.updateWeekDay(day); //update the value in database
}
所以,我做了一些研究(我是安卓新手),发现安卓有不同的调度服务,比如 JobScheduler 或 AlarmManager。我的应用专为 Android 10+(API 29+)而设计。你认为我的问题的最佳解决方案是什么?这是一项非常简单的任务(它不会占用太多电池、互联网……),我需要在每周的特定日期(星期日)执行此操作。此外,即使周日手机关机,这项任务也需要尽快完成。它不需要是后台服务,但我需要保证当用户打开应用程序并且它是新的一周时,该方法需要在之前调用,但前提是它之前的实际一周没有被调用.
有人有想法吗?
解决方案
好的,根据我阅读的其他类似答案,我想我为我的问题找到了一个简单的解决方案。我只需要在每次应用程序启动时运行这些功能。我不需要使用任何后台服务,比如 WorkManager。我只需要在 SharedPreferences 中存储系统重置值的最后日期。然后,每次我打开应用程序时,它都会检查今天是否与上次重置日不同的一周。如果是真的,那么我在问题中运行“for 循环”,并在 SharedPreferences 中将最后一个重置日更新为今天。如果是假的,我什么都不做。
inSameCalendarWeek 方法检查这一天是否与今天的同一年在同一周(Locale.US 保证一周从星期日开始。但我可以将其更改为 Locale.getDefault() 以更灵活)。此外,例如,如果 12 月 31 日与 1 月 1 日在同一周,即使它们在不同年份,该方法也会返回 true。
private void checkAndResetDoneDays() {
long lastResetDay = settings.getLong(LAST_DAY_RESET, 0);
LocalDate date = Instant.ofEpochMilli(lastResetDay).atZone(ZoneId.systemDefault()).toLocalDate();
if (!inSameCalendarWeek(date)) {
resetDoneDays();
settings.edit()
.putLong(LAST_DAY_RESET, LocalDate.now(ZoneId.systemDefault()).atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli())
.commit();
}
}
public boolean inSameCalendarWeek(LocalDate firstDate) {
LocalDate secondDate = LocalDate.now(ZoneId.systemDefault());
// get a reference to the system of calendar weeks in US Locale (to guarantee that week starts on Sunday)
WeekFields weekFields = WeekFields.of(Locale.US);
// find out the calendar week for each of the dates
int firstDatesCalendarWeek = firstDate.get(weekFields.weekOfWeekBasedYear());
int secondDatesCalendarWeek = secondDate.get(weekFields.weekOfWeekBasedYear());
/*
* find out the week based year, too,
* two dates might be both in a calendar week number 1 for example,
* but in different years
*/
int firstWeekBasedYear = firstDate.get(weekFields.weekBasedYear());
int secondWeekBasedYear = secondDate.get(weekFields.weekBasedYear());
// return if they are equal or not
return firstDatesCalendarWeek == secondDatesCalendarWeek
&& firstWeekBasedYear == secondWeekBasedYear;
}
推荐阅读
- node.js - Node JS Promise.all 异步更新 JSON 对象数组中的属性
- c# - 在 C# 中将剪贴板 PrintScreen 保存到图像文件
- java - 使用 C Sharp 在 Java 中重新创建嵌套静态类
- c# - 带有 CancellationToke 的 AddScoped 依赖项
- ios - 如何通过苹果登录获取其他用户信息
- mysql - 在 MySQL Workbench 中访问 MySQL Kubernetes 部署
- javascript - 无法使用 .trim() 方法删除 Angular 应用程序中组件的 HTML 中的空格
- php - 如何在 PHP 中获取当前 url 并从中获取代码
- spring - 为库包声明 @ComponentScan 时未监听 ApplicationReadyEvent
- twilio - Twilio - 字母数字发件人 ID