我有一个任务提醒,允许您将信息存储在数据库中,然后稍后编辑或检索它们(如记事本)。每当启动应用程序然后转到活动时,它将显示已保存的项目,但如果您尝试选择并删除项目,则会崩溃。 你甚至可以点击它来查看它,只是不删除。如果您先添加其他项目,则可以删除其中任何一项。如果我切换到另一个应用程序并回到它,它没关系。只有当应用程序在返回删除之前完全关闭时才会导致问题。
我完全被难倒了。
这是显示项目的开头
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
mDbHelper = new RemindersDbAdapter(this);
mDbHelper.open();
fillData();
setContentView(R.layout.meds);
registerForContextMenu(getListView());
}
private void fillData() {
Cursor remindersCursor = mDbHelper.fetchAllReminders();
startManagingCursor(remindersCursor);
String[] from = new String[] { RemindersDbAdapter.KEY_TITLE };
int[] to = new int[] { R.id.text1 };
SimpleCursorAdapter reminders = new SimpleCursorAdapter(this,
R.layout.reminder_row, remindersCursor, from, to);
setListAdapter(reminders);
}
用于删除的上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.list_menu_item_longpress, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_delete) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
long mRowId = info.id;
cancelReminder();
mDbHelper.deleteReminder(info.id);
fillData();
return true;
}
return super.onContextItemSelected(item);
}
我认为它不在数据库中,因为如果应用程序已经存储了其他内容,它将会删除。
修改 我一直在尝试调试此问题,并在方法cancelReminder
中找到错误的位置public void cancelReminder() {
alarmid = Integer.parseInt(malarmid);
Log.e(TAG2, "meds screen alarmid " + alarmid);
Intent i = new Intent(ReminderManager.mContext, OnAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(ReminderManager.mContext,
alarmid, i, PendingIntent.FLAG_UPDATE_CURRENT);
ReminderManager.mAlarmManager.cancel(pi);
}
由于某种原因,错误在意图中。这是我删除提醒警报的地方。它被设置在另一个活动中,这里是我删除它的地方。真正令人困惑的是,如果应用程序已经运行,我保存另一个提醒我可以删除它们。如果我启动应用程序并直接发送提醒删除它,它就会崩溃。
答案 0 :(得分:0)
找到问题的答案....
尝试从此活动中取消重复警报将无法正常工作,因为它无法获取上下文。相反,我将警报的字符串信息传递给我的alarmManager类并将其删除。
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_delete:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
long mRowId = info.id;
Cursor reminder = mDbHelper.fetchReminder(mRowId);
startManagingCursor(reminder);
malarmid = reminder.getString(reminder
.getColumnIndexOrThrow(RemindersDbAdapter.KEY_RANDOM));
Log.e(TAG2, "meds screen malarmid " + malarmid);
mDbHelper.deleteReminder(info.id);
fillData();
new ReminderManager(this).cancelReminder(info.id, malarmid);
return true;
}
return super.onContextItemSelected(item);
}
和reminderManager类
public void cancelReminder(long mRowId, String malarmid) {
int alarmid = Integer.parseInt(malarmid);
Log.e(TAG2, "Reminder Manager Cancel Reminder convert from malarm to alarmid " + alarmid);
Intent i = new Intent(mContext, OnAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(mContext,
alarmid, i, PendingIntent.FLAG_UPDATE_CURRENT);
ReminderManager.mAlarmManager.cancel(pi);
}