Обработка асинхронного добавления строки базы данных SQLite - PullRequest
0 голосов
/ 24 марта 2012

Я занимаюсь разработкой приложения, которое состоит из 2 частей: Activity и BroadcastReceiver.BroadcastReceiver обрабатывает входящие SMS и может создавать новые строки в базе данных.

У меня проблема: если активность открыта и активна, когда BroadcastReceiver добавляет новую строку в базу данных - новая строка не отображается в ListView активности.

Я пытался использовать Cursor наблюдатели для курсора listView, но этот наблюдатель вызывает уведомление только об изменении строки.При добавлении новой строки этот наблюдатель ничего не делает.

Вот пример кода:

m_testCursor = m_dbAdapter.fetchAll();
m_testCursor.registerContentObserver(
    new ContentObserver(new Handler()) 
    {
        @Override
        public void onChange(boolean selfChange)
        {
            Log.w("my_tag", "test content changed");                    
        }
    }
);

m_testCursor.registerDataSetObserver(
    new DataSetObserver()  
    {
        @Override
        public void onChanged()
        {
            Log.w("my_tag", "test data set changed");                       
        }
    }
);

SimpleCursorAdapter checks = new SimpleCursorAdapter(this, R.layout.nodes_row, m_testCursor, from, to);
setListAdapter(checks);

Можно ли как-то обработать добавление новых строк в Activity из части BroadcastReceiver?Все, что мне нужно, это просто вызвать один из методов обновления пользовательского интерфейса.

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Вы можете вызвать setNotificationUri () на вашем курсоре и после изменения в вызове db notifyChange () на ContentResolver. Чтобы получить ContentResolver, позвоните getContentResolver(). Используйте один и тот же URI в обоих вызовах

в вашей деятельности

Uri uri = Uri.parse("content://your_database");
m_testCursor = m_dbAdapter.fetchAll();
m_testCursor.setNotificationUri(getContentResolver(),uri)

в базе данных методы создания / обновления / удаления после изменения

Uri uri = Uri.parse("content://your_database");
getContentResolver().notifyChange(uri, null);

Вы также можете вызвать setNotificationUri() непосредственно в методе fetchAll() и определить Uri как статическую переменную конечного экземпляра вашего класса db.

0 голосов
/ 24 марта 2012

Имеется ли checks объект в приемнике вещания?Если это так и если вам нужен только метод обновления пользовательского интерфейса, я думаю, вам следует просто вызвать checks.notifiDatasetChanged(), когда набор данных изменился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...