Android 首次加载页面后无法删除数据库项

Android 首次加载页面后无法删除数据库项,android,database,Android,Database,我有一个任务提醒,允许你将信息存储在数据库中,然后像记事本一样编辑或检索它们。无论何时启动应用程序,然后进入活动,它都会显示已保存的项目,但如果您尝试选择并删除一个项目,它将崩溃。 你甚至可以点击它来查看,而不是删除。如果您首先添加了另一项,则可以删除其中任何项和所有项。如果我切换到另一个应用程序并返回到它,它是好的。只有当应用程序在返回删除之前完全关闭时,才会导致问题 我完全被难住了 以下是显示项目的开始 @Override public void onCreate(Bundle savedI

我有一个任务提醒,允许你将信息存储在数据库中,然后像记事本一样编辑或检索它们。无论何时启动应用程序,然后进入活动,它都会显示已保存的项目,但如果您尝试选择并删除一个项目,它将崩溃。 你甚至可以点击它来查看,而不是删除。如果您首先添加了另一项,则可以删除其中任何项和所有项。如果我切换到另一个应用程序并返回到它,它是好的。只有当应用程序在返回删除之前完全关闭时,才会导致问题

我完全被难住了

以下是显示项目的开始

@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);
}    
我认为它不在数据库中,因为如果应用程序已经存储了其他内容,它会很好地删除

编辑 我一直在尝试调试这个问题,并在方法中找到了错误的位置

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

}

出于某种原因,错误出现在意图中。这是我删除提醒警报的地方。它最初是在另一个活动中设置的,这里是我删除它的地方。真正让人困惑的是,如果应用程序一直在运行,我保存了另一个提醒,我可以删除它们。如果我启动应用程序并直接转到提醒删除它,它将崩溃。

找到了问题的答案

尝试取消此活动中的重复报警无效,因为它无法获取上下文。相反,我将报警的字符串信息传递给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);
}
还有提醒管理器类

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

}