сделать простой курсорадаптер отражать изменения в базе данных

В моем приложении есть база данных SqlLite с таблицей, содержащей список сообщений. У каждого сообщения есть «отправитель» и «тело».

У меня есть действие, содержащее ListView, которое просто отображает все сообщения в базе данных с помощью курсора и адаптера курсора. Вот соответствующий код:

    Cursor cursor = mDbAdapter.fetchAllMessages();
    String[] from = { MessageDbAdapter.KEY_SENDER, MessageDbAdapter.KEY_BODY };
    int[] to = { R.id.TextSender , R.id.TextMessage };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.messagerow, cursor, from, to);
    mMessageList.setAdapter(adapter);

В моем приложении в фоновом режиме работает служба, которая может вставлять новые сообщения в базу данных в любое время (пользователь может или не может просматривать активность списка).

Мой вопрос заключается в следующем: если пользователь просматривает активность списка и в базу данных добавляется новое сообщение, как я могу заставить ListView отразить это изменение (отобразить только что добавленное сообщение)

Я подумал о том, чтобы служба запускала широковещательную рассылку, когда сообщение было добавлено в базу данных. Затем, когда активность получит эту широковещательную рассылку, выполните запрос еще раз. Однако я опасаюсь, что fetchAllMessages() неэффективно, когда я знаю, что было добавлено только 1 сообщение, тем более что сообщения могут добавляться часто.


person jwheels    schedule 22.08.2011    source источник
comment
Как насчет регистрации широковещательного приемника, который будет слушать намерение, отправленное вашей службой. Когда получено это намерение, обновите ListView в своей деятельности.   -  person hooked82    schedule 22.08.2011
comment
пожалуйста, прочтите мою новую правку к вопросу.   -  person jwheels    schedule 22.08.2011
comment
Вы можете вызвать getChildAd (int index) и обновить одну строку, если была обновлена ​​только одна. См. Это сообщение: stackoverflow.com/questions/2123083/ < / а>   -  person hooked82    schedule 22.08.2011
comment
Возможно, вы захотите использовать загрузчик, он упрощает эти проблемы.   -  person Pikaling    schedule 22.08.2011
comment
Вы можете попробовать просто вызвать Cursor.requery () из вашего метода приемника. А затем вызовите adapter.notifyDataSetChanged (), и, как сказала Вики ... загрузчик может пригодиться, поскольку startManagingCursor (Cursor c) устарел.   -  person nahwarang    schedule 22.08.2011