- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个闹钟应用程序,用户可以在其中选择日期和时间。数据存储在 SQL 数据库中。我想要做的是在到达该时间后发出通知。我尝试通过简单地使用用户选择的时间来做到这一点,但即使我删除闹钟或编辑时间,闹钟仍然存在。这就是为什么我需要使用数据库中的数据,所以如果警报被删除,通知将不会通过。我查看了互联网上的所有相关内容,但似乎没有任何效果。这是我在数据库中插入数据以及在 TextView 中显示日期和时间的代码。
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;
}
我很感激任何帮助。谢谢。
最佳答案
我相信,您有两种相对简单的方法,也许可以一起使用。
您可以 a) 在警报时间到期时删除 行。 repeat 列 可能用于重复警报,在这种情况下需要更新 而不是删除(这需要 b))。
您可以 b) 还可以更具体地说明将警报添加到仅选择 future 日期/时间的行的查询。
所以不需要另一个游标。
就我个人而言,我会(并且已经使用过,如下所示)使用时间戳将单个列用于日期和时间,而不是尝试使用两列。
以下是一个示例,类似于基于日期/时间的选择。 (处理在常规用户定义的基础上将项目添加到购物 list 的重复规则):-
String filter = DBRulesTableConstants.RULES_ACTON_COL +
" <= " +
Long.toString(getDateTimeOfAllofToday()) +
SQLAND +
DBRulesTableConstants.RULES_PROMPT_COL +
" = 0 ";
(DBRulesTableConstants.RULES_????_ COL
等同于列名,SQLAND
为AND
),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);
}
关于android - 如何将 AlarmManager 与存储在 SQLite 数据库中的数据一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46304450/
我想在每次触发 AlarmManager 时额外更改 Intent。这可能吗,我如何在 AlarmManager 触发后立即调用它? 代码: public void startCollector(){
public class AlarmManagerClass extends BroadcastReceiver { public static boolean haveInternet
我正在寻找执行简单任务的最有效方法。作为一名新的 android 开发人员,我不太确定这些策略中的哪一个在内存效率方面最适合我的应用程序。我想其中一些方法可能会导致我不知道的线程问题。 所有三个解决方
我的应用程序有一个实时模块,它应该每 60 秒 ping 服务器一次。否则,连接将断开,设备将需要重新连接。 第一次尝试是使用 Thread.Sleep 使 ping 线程以所需的频率运行。第二次尝试
我有一组在重启后需要保留的警报。我试过在启动接收器上使用,但它们不会重新启动。我不确定我是否了解启动接收器以及如何重新启动所有警报。我已经有一个接收器来接收我的通知,但不知道我是否可以使用同一个接收器
我有一个要在其中创建警报的 Android 应用程序。这是一个正常的闹钟,应该在指定的时间叫醒你。与任何警报一样,您还可以通过在创建警报时选择声音文件来指定它将使用哪种警报声音。 闹钟效果很好,它在正
我的任务是定期读取后端的手机传感器(例如 WiFi、加速度计)。 我目前的解决方案是使用 AlarmManager。 具体来说,我们有: 在“主”程序(一个 Activity )中,我们使用 Pend
public void SetAlarm(Context context, int sec) { AlarmManager am=(AlarmManager)context.getSyst
我已经通过警报管理器制作了简单的警报,问题是当插入很多秒时,它无法及时工作,这是我在这里声明的 这是代码 mo = ((Integer.parseInt(mons.getText().toStrin
我在应用程序中设置了一个闹钟,每 X 分钟触发一次通知。第一次有效,但随后就不重复了。 我正在开发的 API 是 API 18 (Android 4.3)。 MainActivity.class pu
我很难专心于对 AlarmManager 进行编程。 下面的代码几乎只是将当前日期分配给文本字段并获取一些 XML 并使用 setListAdapter 显示它。我希望这段代码在启动时运行,然后每 3
我对如何停止 AlarmManager 有疑问。我想在“x”小时开始并在“y”小时停止,由用户设置。我知道“.cancel”功能的存在,但不知道如何设置“y”小时内的停止时间。 创建时 final E
我的应用程序有一个 AlarmManager 设置为每 60 秒触发一次。它会触发一个 fragment ,该 fragment 检查当前时间并查找应用程序日历中当时是否有任何事件发生。它运行得很好,
我正在尝试安排使用 AlarmManager 调用的方法,但它似乎不起作用。我看过其他例子,但他们的例子不适合我。所以我认为这是我的代码中的一些内容。这是 AlarmManager 代码: Alarm
我将 AlarmManager 设置如下: Intent startIntent = new Intent(context, MyService.class); PendingIntent pend
我正在尝试使用警报管理器发出警报。应用程序运行时没有任何错误消息,但没有任何反应。 我尝试了来自developer.android.com的解决方案和来自stackoverflow的建议。我也尝试复制
public class background_alarm extends BroadcastReceiver { @Override public void onReceive(Context co
我编写了一个每天凌晨 5:22 运行的闹钟代码。该代码在第一个时间间隔内运行良好,但在第二个时间间隔内会在 24 小时之前触发。 我在 MainActivity 的 onCreate() 方法中添加了
我在这些类(class)中有两个类(class),A,B。他们两个我都有一个像下一个这样的警报管理器; class A{ PendingIntent sender; AlarmManager am
我在 9:00 和 21:00 有两个 AlarmManager,但只运行第二个闹钟。 ////////9:00am///////// Intent aviso = new Inten
我是一名优秀的程序员,十分优秀!