0

情報をデータベースに保存し、後で編集または取得できるタスク リマインダーがあります (メモ帳のように)。アプリを起動してからアクティビティに移動するたびに、保存されたアイテムが表示されますが、アイテムを選択して削除しようとするとクラッシュします。クリックして確認することもできますが、削除することはできません。最初に別のアイテムを追加すると、それらのすべてを削除できます。別のアプリに切り替えて戻ってきても問題ありません。アプリが削除に戻る前に完全にシャットダウンした場合にのみ、問題が発生します。

私は完全に困惑しています。

これがアイテムを表示する最初の部分です

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

}

エラーは何らかの理由で Intent にあります。これは、リマインダーのアラームを削除しているところです。元は別のアクティビティに設定されており、ここで削除しています。本当に混乱するのは、アプリが実行されていて、それらを削除できる別のリマインダーを保存している場合です。アプリを起動して削除のリマインダーに移動すると、アプリがクラッシュします。

4

1 に答える 1

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

}
于 2013-05-17T19:56:41.620 に答える