2017-09-19 45 views
1

我正在用户选择日期和时间的闹钟应用程序。数据存储在SQL数据库中。我想要做的就是在达到时间后通知通知。我试图简单地使用用户选择的时间,但即使删除闹钟或编辑时间,闹钟仍然存在。这就是为什么我需要使用数据库中的数据,所以如果警报被删除,通知将不会通过。我查看了互联网上的所有相关内容,似乎没有任何工作。这是我在数据库中插入数据的位置,以及在文本视图中显示日期和时间的位置。如何将AlarmManager与存储在SQLite数据库中的数据一起使用?

databaseHelperAlarm = new DatabaseHelperAlarm(this); 

final Calendar c = Calendar.getInstance(); 
     final int mYear = c.get(Calendar.YEAR); 
     final int mMonth = c.get(Calendar.MONTH); 
     final int mDay = c.get(Calendar.DAY_OF_MONTH); 
     final int mHour = c.get(Calendar.HOUR_OF_DAY); 
     final int mMinute = c.get(Calendar.MINUTE); 

    xml_arrow_back.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(AddAlarmActivity.this, AlarmActivity.class); 
      startActivity(intent); 
     } 
    }); 

    xml_fab_add.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String title = xml_title.getText().toString(); 
      String date = xml_date.getText().toString(); 
      String time = xml_time.getText().toString(); 
      String repeat = xml_repeat.getText().toString(); 

      if ((xml_title.getText().toString().equals("")) || (xml_date.getText().toString().equals("")) || (xml_time.getText().toString().equals(""))) { 
       Toast.makeText(getApplicationContext(), "Fields Must Not Be Empty", Toast.LENGTH_SHORT).show(); 
      } else { 
       databaseHelperAlarm.insertData(title, date, time, repeat); 
       Toast.makeText(getApplicationContext(), "Reminder Made", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(AddAlarmActivity.this, AlarmActivity.class); 
       startActivity(intent); 
      } 
     } 
    }); 

    xml_set_date.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      InputMethodManager input = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      input.hideSoftInputFromWindow(xml_set_date.getWindowToken(), 0); 
      xml_title.clearFocus(); 

      datePickerDialog = new DatePickerDialog(AddAlarmActivity.this, 
        new DatePickerDialog.OnDateSetListener() { 
         @Override 
         public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
          Calendar calendar = Calendar.getInstance(); 
          calendar.set(year, monthOfYear, dayOfMonth); 
          SimpleDateFormat format = new SimpleDateFormat("EEE, MMM dd, yyyy"); 
          String dateString = format.format(calendar.getTime()); 
          xml_date.setText(dateString); 
         } 
        }, mYear, mMonth, mDay); 
      datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000); 
      if(!datePickerDialog.isShowing()){ 
       datePickerDialog.show(); 
      } 
     } 
    }); 

    xml_set_time.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      InputMethodManager input = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      input.hideSoftInputFromWindow(xml_set_time.getWindowToken(), 0); 
      xml_title.clearFocus(); 

      timePickerDialog = new TimePickerDialog(AddAlarmActivity.this, 
        new TimePickerDialog.OnTimeSetListener() { 
         @Override 
         public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { 

          String chosenHour = ""; 
          String chosenMinute = ""; 
          String chosenTimeZone = ""; 
          if(selectedHour > 12){ 
           chosenTimeZone = "PM"; 
           selectedHour = selectedHour - 12; 
           if(selectedHour < 10){ 
            chosenHour = "0"+selectedHour; 
           }else{ 
            chosenHour = ""+selectedHour; 
           } 
          }else{ 
           chosenTimeZone = "AM"; 
           if(selectedHour < 10){ 
            chosenHour = "0"+selectedHour; 
           }else{ 
            chosenHour = ""+selectedHour; 
           } 
          } 

          if(selectedMinute < 10){ 
           chosenMinute = "0"+selectedMinute; 
          }else{ 
           chosenMinute= ""+selectedMinute; 
          } 

          xml_time.setText(chosenHour + ":" + chosenMinute +" "+chosenTimeZone); 
         } 
        }, mHour, mMinute, false); 
      timePickerDialog.show(); 
     } 
    });} 

}

我的猜测是,我需要另一个光标或东西,但我不知道从哪里开始。这里是我的数据库的代码的一部分,但。

public void insertData (String a_title, String a_date, String a_time, String a_repeat){ 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(A_TITLE, a_title); 
     contentValues.put(A_DATE, a_date); 
     contentValues.put(A_TIME, a_time); 
     contentValues.put(A_REPEAT, a_repeat); 

     SQLiteDatabase sqLiteDB = this.getWritableDatabase(); 
     sqLiteDB.insert(TABLE_NAME, null, contentValues); 
     sqLiteDB.close(); 
    } 

    public ArrayList<AlarmInfo> getMainInfo() { 
     ArrayList<AlarmInfo> list = new ArrayList<>(); 
     String SQL = "SELECT * FROM " + TABLE_NAME; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(SQL, null); 
     if (cursor.moveToFirst()) { 
      do { 
       AlarmInfo ai = new AlarmInfo(); 
       ai.setiD(cursor.getInt(0) + ""); 
       ai.setTitle(cursor.getString(1)); 
       ai.setDate(cursor.getString(2)); 
       ai.setTime(cursor.getString(3)); 
       list.add(ai); 
      } while (cursor.moveToNext()); 
     } 
     return list; 
    } 

    public Cursor getAllData(int getId) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor res = db.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE " + 
       A_ID + "=?", new String[] {Integer.toString(getId)}); 
     return res; 
    } 

我感谢任何帮助。谢谢。

回答

1

我相信,你有两个相对简单的方法,也许一起使用。

您可以a)删除行,当闹钟时间已过期。这可能是重复列用于重复警报,在这种情况下更新而不是删除将需要(这将需要b))。

您可以b)也可以更加具体地说明驱动添加闹钟的查询/查询只为未来日期/时间选择行

所以没有真正需要另一个游标本身。


我个人(和已经使用,如下)使用单列日期和时间使用时间戳,而不是试图与两列连续工作。

以下是一个例子,类似于基于日期/时间的选择。 (处理重复的项目到购物清单中添加的是一个用户定义的基础上的规则): -

String filter = DBRulesTableConstants.RULES_ACTON_COL + 
    " <= " + 
    Long.toString(getDateTimeOfAllofToday()) + 
    SQLAND + 
    DBRulesTableConstants.RULES_PROMPT_COL + 
    " = 0 "; 

DBRulesTableConstants.RULES_????_ COL等同于列名,SQLANDAND),getDateTimeofALlofToday,millsecond的午夜之前返回时间戳1当天(即在这种情况下,我希望今天之前和今天的所有规则(酒吧,1毫秒:)))。

例如现在运行此(约​​14:20二零一七年九月二十零日)导致所述过滤器: -

ruleacton <= 1505915999999 AND ruleprompt = 0 

此被纳入queury的WHERE子句例如: -

SELECT ........ WHERE ruleacton <= 1505915999999 AND ruleprompt = 0 ; 

万一你有兴趣在这里是getDateTimeOfAllofToday: -

private long getDateTimeOfAllofToday() { 
    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.DAY_OF_MONTH,1); // tomorrow 
    cal.set(Calendar.MILLISECOND,0); 
    cal.set(Calendar.SECOND,0); 
    cal.set(Calendar.MINUTE,0); 
    cal.set(Calendar.HOUR_OF_DAY,0); 
    cal.add(Calendar.MILLISECOND,-1); 
} 
相关问题