根据数据库中的日期设置警报

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);

你会赢。