2016-05-25 12 views
0

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

Приложение имеет кнопку, нажимая кнопку 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); 
       } 
      } 
     }; 
+0

Это выглядит нормально. Какова конфигурация вашего царства? –

+0

см. EDIT1 –

+0

Как вы обнаруживаете, что Царство пустое после выполнения этого кода? –

ответ

0

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

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

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

, а затем вы делаете новый запрос, добавить НОВЫЙ ChangeListener и хочет получать уведомление от него, но после уведомления посыла, слушатель удаляется с помощью кода выше.

добавление изменений в async извлеченное realmResult - правильно, должно работать нормально! Так удалить этот блок в IntentSevice

realm.removeAllChangeListeners(); 

Кроме того, ваш слушатель выглядит очень странно, видеть коментарии в вашем 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); 
      } 
     } 
    }; 
+0

У меня проблема. Если я использую Service - ChangeListener, то работа хорошая. если я использую IntentService - ChangeListener сломан !!! IntentService - имеет отдельный поток. Я думаю, что это причина проблем. –

+0

Служба запускается в том же потоке, с которого она запускается (поток пользовательского интерфейса). IntentService работает во втором потоке петлителя. Интересно, может ли петлитель каким-то образом «украсть» сообщение REALM_CHANGED из потока пользовательского интерфейса. @ChristianMelchior? – EpicPandaForce

+1

Нет, у нас есть внутренний список Realm на всех потоках Looper, и каждый петлектор получает свое собственное сообщение. –

0

Что-то, что ошибки мне в этом коде является то, что вы должны получить последнюю версию объекта недвижимости внутри транзакции

@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( эта конструкция означает, что вы никогда не будете в состоянии закрыть Realm в потоке пользовательского интерфейса.

EDIT: Вы уверены, что

  mResPartners.removeChangeListeners(); 

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

+0

Вам не нужно получать последнюю версию объекта realm внутри транзакции! Транзакция должна содержать код, который каким-то образом изменяет данные БД, и совершается как можно быстрее! –

+0

findAllAsync - я звоню гораздо позже. Здесь проблема с ChangeListener Они не звонят после IntentService. Это очень странно !!! –

+0

Вы пробовали, что я сказал, хотя. – EpicPandaForce