2013-05-16 2 views
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); 
}  

Я не думаю, что в базе данных, потому что, если приложение будет удалить только штраф уже хранит что-то еще.

EDIT Я пытался отладить эту проблему и нашел место ошибки в методе 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

Найден ответ на вопрос ....

Попытка отменить повторяющееся тревогу от этой деятельности не будет работать, потому что он не мог получить контекст. Вместо этого я передал информацию о строках для тревоги в мой класс 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); 

} 
Смежные вопросы