【问题标题】:How to use AlarmManager with the data that is stored in SQLite Database?如何将 AlarmManager 与存储在 SQLite 数据库中的数据一起使用?
【发布时间】:2017-09-19 15:33:50
【问题描述】:

我正在制作一个警报应用程序,用户可以在其中选择日期和时间。数据存储在 SQL 数据库中。我想要做的是在到达该时间后调用通知。我尝试通过简单地使用用户选择的时间来执行此操作,但即使我删除警报或编辑时间,警报仍然存在。这就是为什么我需要使用数据库中的数据,所以如果警报被删除,通知将不会通过。我已经查看了互联网上所有相关的内容,但似乎没有任何效果。这是我在数据库中插入数据并在文本视图中显示日期和时间的代码。

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

}

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

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

感谢您的帮助。谢谢。

【问题讨论】:

    标签: android mysql sqlite notifications alarmmanager


    【解决方案1】:

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

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

    您可以 b) 还可以更具体地说明驱动添加警报的查询/查询以仅选择未来日期/时间的行

    所以没有真正需要另一个这样的光标。


    就我个人而言,我会(并且已经使用过,如下所示)使用 时间戳 将日期和时间使用一列,而不是尝试使用两列。

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

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

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

    例如现在运行(大约 2017 年 9 月 20 日 14:20)导致过滤器为:-

    ruleacton <= 1505915999999 AND ruleprompt = 0 
    

    这被合并到查询的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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多