2015-05-04 97 views
0

我找到了一个帮助我获得闹钟设置的教程,但在教程中我们使用了日期选择器来设置闹钟的时间。一切进展顺利,所以我试图用我自己的方法替换日期选择器,然后设置闹钟。问题是它似乎没有工作,当我将该日期设置为今天时不会弹出警报,但在使用日期选择器时工作正常。谁能告诉我我做错了什么?我通过调试运行这个,我的查询返回正确的日期,我得到正确的数字和所有,但它似乎并没有工作。根据数据库中的日期设置闹钟

我希望有人能指出我错过的东西?

编辑

我打电话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天前报警。我通过更改手机的日期并将它设置为今天的闹钟来测试它,但都没有奏效。

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

} 
+0

你在哪里调用这个方法'setNotif()'?让它在按钮回调中强制UI线程上的动作。是否有可能你在后台线程,所以敬酒不敬酒? – xbakesx

+0

哦忘了提及。我会把它放在一个编辑中,谢谢。 – Cai

+0

数据库中的日期是什么样的?你确定它是inyyyy-MM-dd格式吗?你的转换为日历的方法似乎有点奇怪。你在LogCat中获得什么? – JonasCz

回答

2

这是一个简单的路障碰上了,遗憾的是,并没有真正有什么与Android。这是Java日期/日历的延期。

当你拉日从int month出来的日期选取器的示例代码你走出值为0依据:

int month = picker.getMonth(); 
// January -> 0 
// February -> 1 
// ... 
// December -> 11 

在数据库中的日期我们已经习惯了日期看:2016-12-25是2016年12月25日。

当您设置Calendar的值时,它期望0索引的月份。你给它一个索引为1的月份。所以你需要从月份中减去1来获得正确的值。我会制作一张桌子,以便清楚发生了什么事:

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

你就赢了。

+0

我明白了,所以当使用'Calendar'时,将月份加1只是为了代表一个人类的日期,自然而然地是从人类日期到一个'日历'日期。非常感谢你的澄清。干杯! – Cai