realm и IntentService

Я заполнил базу данных realm. Все работает хорошо.

Приложение имеет кнопку, нажатие на которую запускает IntentService. Это очень просто для теста

код здесь

public class HNotificationService extends IntentService {
    public HNotificationService() {
        super("HNotificationService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("HNotificationService", "onHandleIntent");

        Realm realm = Realm.getDefaultInstance();
        RealmResults<HPartner> mResPartner = realm.where(HPartner.class).findAll();
        final HPartner hPartner = mResPartner.get(0);
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                hPartner.setName("test");
            }
        });
        realm.close();
    }
}

После выполнения этого кода база данных становится пустой! Я не вижу никаких ошибок в журнале.

Отмечать. Очистка базы данных происходит только тогда, когда я хочу что-то записать.
Буду рад любой помощи

EDIT1

Внутри класса приложений. Я использую этот код

  RealmConfiguration config = new RealmConfiguration.Builder(this).build();
  Realm.setDefaultConfiguration(config);

EDIT2

да вы правы база данных не удаляется!

Log.e("HNotificationService", "empty"); — Он никогда не называется, и это хорошо

        Realm realm = Realm.getDefaultInstance();
        RealmResults<HPartner> mResPartner = realm.where(HPartner.class).findAll();
        if (mResPartner.size() > 0) {
            Log.e("HNotificationService", "don't empty!");
        }

        final HPartner hPartner = mResPartner.get(0);
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                hPartner.setName("test");
            }
        });

        mResPartner = realm.where(HPartner.class).findAll();
        if (mResPartner.size() == 0) {
            Log.e("HNotificationService", "empty");
        }

        realm.removeAllChangeListeners();
        realm.close();

Другая причина. Когда я иду на другой экран, я вызываю код

        mResPartners = Realm.getDefaultInstance().where(HPartner.class).findAllAsync();
        mResPartners.removeChangeListeners();
        mResPartners.addChangeListener(mPartnersListener);

И mPartnersListener никогда не вызывается. Это очень странно.
если не запустить IntentService. mPartnersListener всегда вызывается

EDIT 3

 mPartnersListener = new RealmChangeListener<RealmResults<HPartner>>() {
            @Override
            public void onChange(RealmResults<HPartner> realmResult) {
                mResPartners.removeChangeListeners();
                mClusterManager.clearItems();
                mGoogleMap.clear();
                if (realmResult != null && realmResult.size() > 0) {
                    mListPartners = realmResult;
                    getLoaderManager().restartLoader(LMarkerIcons.ID_LOADER, null, FrAroundMeMap.this);
                }
            }
        };

2 ответа

  1. Я думаю, я узнаю проблему !Удалите allChangelisteners в IntentService после регистрации в этой части.

    mResPartner = realm.where(HPartner.class).findAll();
        if (mResPartner.size() == 0) {
            Log.e("HNotificationService", "empty");
        }
    
        realm.removeAllChangeListeners();
        realm.close();
    

    и тогда вы делаете новый запрос, добавляете новый changeListener и хотите получать уведомления от него, но после отправки уведомления, прослушиватель удаляется кодом выше.

    добавление changelistener в асинхронную выборку realmResult-правильно, должно работать нормально!
    Поэтому удалите этот блок в IntentSevice

    realm.removeAllChangeListeners();
    

    Кроме того, ваш слушатель выглядит очень странно, см. coments в вашем onChange

    mPartnersListener = new RealmChangeListener<RealmResults<HPartner>>() {
            @Override
            public void onChange(RealmResults<HPartner> realmResult) {
    
                // here U remove listener BEFORE do your stuff and 
                // onChange will never called again 
                // If U`ll put log here U find out, that listener was called
                // simple delete block -> mResPartners.removeChangeListeners(); 
    
                mResPartners.removeChangeListeners(); 
                mClusterManager.clearItems();
                mGoogleMap.clear();
                if (realmResult != null && realmResult.size() > 0) {
                    mListPartners = realmResult;
                    getLoaderManager().restartLoader(LMarkerIcons.ID_LOADER, null, FrAroundMeMap.this);
                }
            }
        };
    
  2. Что-то, что меня беспокоит в этом коде, заключается в том, что вы должны получить последнюю версию объекта realm внутри транзакции

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("HNotificationService", "onHandleIntent");
    
        Realm realm = Realm.getDefaultInstance();
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                RealmResults<HPartner> mResPartner = realm.where(HPartner.class).findAll();
                final HPartner hPartner = mResPartner.get(0);
                hPartner.setName("test");
            }
        });
        realm.close();
    }
    

    Кроме этого, я бы попытался заменить async()запрос версией синхронизации.

    mResPartners = Realm.getDefaultInstance().where(HPartner.class).findAll();
    

    Также стоит отметить тот факт, что Realm.getDefaultInstance().where(эта конструкция означает, что вы никогда не сможете закрыть область в потоке пользовательского интерфейса.

    EDIT: вы уверены

                mResPartners.removeChangeListeners();
    

    Не вызывает никаких проблем у вашего слушателя изменений?