根据数据库中的日期设置警报
Setting an alarm based on date in database
我找到了一个帮助我设置闹钟的教程,但在教程中我们使用了日期选择器来设置闹钟的时间。一切顺利,所以我尝试用我自己的方法替换日期选择器并以此方式设置闹钟。问题是它似乎不起作用,当我将该日期设置为今天时没有弹出警报,但当我使用日期选择器时工作正常。谁能告诉我我做错了什么?我 运行 通过调试进行此操作,我的查询返回了正确的日期,我得到了正确的数字和所有但它似乎不起作用。
我希望有人能指出我遗漏了什么?
编辑
我通过ui中的一个按钮调用setNotif()
。我基本上将其改造为只有一个用于测试的按钮。我得到了祝酒词,但无论我尝试什么,闹钟都没有响起。
这是原始日期选择器代码
public void onDateSelectedButtonClick(View v){
int day = picker.getDayOfMonth();
int month = picker.getMonth();
int year = picker.getYear();
Calendar c = Calendar.getInstance();
c.set(year, month, day);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
scheduleClient.setAlarmForNotification(c);
Toast.makeText(this, "Notification set for: "+ day +"/"+ (month+1) +"/"+ year, Toast.LENGTH_SHORT).show();
}
下面是我尝试替换的方法
它调用查询以从我的数据库中获取特定日期,并且应该在 3 天前设置警报。我通过更改 phone 的日期并将闹钟设置为今天来测试它,但都没有用。
public void setNotif() {
// Getting the next date of payments which the alarm will be based on
DatabaseHelper db = new DatabaseHelper(this);
String thisdate = getCurDate();
Cursor cur = db.nextdate(thisdate);
String date= "";
if (cur!= null) {
if (cur.moveToFirst()) {
date = cur.getString(0);
}
}
try {
DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
Date input = inputFormat.parse(date);
String finaldate = inputFormat.format(input);
String d = finaldate.substring(8,10);
String m = finaldate.substring(5,7);
String y = finaldate.substring(0,4);
int da = Integer.parseInt(d);
int month = Integer.parseInt(m);
int year = Integer.parseInt(y);
int day = da - 3;
Calendar c = Calendar.getInstance();
c.set(year, month, day);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
scheduleClient.setAlarmForNotification(c);
Toast.makeText(this, "Notification set for: "+ day +"/"+ month +"/"+ year, Toast.LENGTH_SHORT).show();
}catch (Exception ex) {
Alerts.CatchError(Kik.this, ex.toString());
}
}
这是通往 运行 的一个简单障碍,不幸的是,它 真的 与 Android 没有任何关系。这是 Java date/calendar 的遗留问题。
当您从示例代码中的日期选择器中提取 int month
中的日期时,您得到的值是基于 0 的:
int month = picker.getMonth();
// January -> 0
// February -> 1
// ...
// December -> 11
您数据库中的日期是我们习惯查看的日期:2016-12-25
是 2016 年 12 月 25 日。
当您设置 Calendar
的值时,它期望一个 0 索引的月份。你给它一个 1 索引的月份。因此,您需要从月份中减去 1 以获得正确的值。我会做一个 table 以便清楚发生了什么:
Month String | Database Value | Calendar Value
January | 1 | 0
February | 2 | 1
March | 3 | 2
April | 4 | 3
May | 5 | 4
June | 6 | 5
希望这很明显。
所以在你的情况下,如果你改变行:
c.set(year, month, day);
成为...
c.set(year, month - 1, day);
你会赢。
我找到了一个帮助我设置闹钟的教程,但在教程中我们使用了日期选择器来设置闹钟的时间。一切顺利,所以我尝试用我自己的方法替换日期选择器并以此方式设置闹钟。问题是它似乎不起作用,当我将该日期设置为今天时没有弹出警报,但当我使用日期选择器时工作正常。谁能告诉我我做错了什么?我 运行 通过调试进行此操作,我的查询返回了正确的日期,我得到了正确的数字和所有但它似乎不起作用。
我希望有人能指出我遗漏了什么?
编辑
我通过ui中的一个按钮调用setNotif()
。我基本上将其改造为只有一个用于测试的按钮。我得到了祝酒词,但无论我尝试什么,闹钟都没有响起。
这是原始日期选择器代码
public void onDateSelectedButtonClick(View v){
int day = picker.getDayOfMonth();
int month = picker.getMonth();
int year = picker.getYear();
Calendar c = Calendar.getInstance();
c.set(year, month, day);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
scheduleClient.setAlarmForNotification(c);
Toast.makeText(this, "Notification set for: "+ day +"/"+ (month+1) +"/"+ year, Toast.LENGTH_SHORT).show();
}
下面是我尝试替换的方法
它调用查询以从我的数据库中获取特定日期,并且应该在 3 天前设置警报。我通过更改 phone 的日期并将闹钟设置为今天来测试它,但都没有用。
public void setNotif() {
// Getting the next date of payments which the alarm will be based on
DatabaseHelper db = new DatabaseHelper(this);
String thisdate = getCurDate();
Cursor cur = db.nextdate(thisdate);
String date= "";
if (cur!= null) {
if (cur.moveToFirst()) {
date = cur.getString(0);
}
}
try {
DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
Date input = inputFormat.parse(date);
String finaldate = inputFormat.format(input);
String d = finaldate.substring(8,10);
String m = finaldate.substring(5,7);
String y = finaldate.substring(0,4);
int da = Integer.parseInt(d);
int month = Integer.parseInt(m);
int year = Integer.parseInt(y);
int day = da - 3;
Calendar c = Calendar.getInstance();
c.set(year, month, day);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
scheduleClient.setAlarmForNotification(c);
Toast.makeText(this, "Notification set for: "+ day +"/"+ month +"/"+ year, Toast.LENGTH_SHORT).show();
}catch (Exception ex) {
Alerts.CatchError(Kik.this, ex.toString());
}
}
这是通往 运行 的一个简单障碍,不幸的是,它 真的 与 Android 没有任何关系。这是 Java date/calendar 的遗留问题。
当您从示例代码中的日期选择器中提取 int month
中的日期时,您得到的值是基于 0 的:
int month = picker.getMonth();
// January -> 0
// February -> 1
// ...
// December -> 11
您数据库中的日期是我们习惯查看的日期:2016-12-25
是 2016 年 12 月 25 日。
当您设置 Calendar
的值时,它期望一个 0 索引的月份。你给它一个 1 索引的月份。因此,您需要从月份中减去 1 以获得正确的值。我会做一个 table 以便清楚发生了什么:
Month String | Database Value | Calendar Value
January | 1 | 0
February | 2 | 1
March | 3 | 2
April | 4 | 3
May | 5 | 4
June | 6 | 5
希望这很明显。
所以在你的情况下,如果你改变行:
c.set(year, month, day);
成为...
c.set(year, month - 1, day);
你会赢。