2016-05-25 14 views
0

Ich habe Realm-Datenbank gefüllt. Alles funktioniert gut.Realm und IntentService

Die Anwendung verfügt über eine Schaltfläche, durch Drücken wird IntentService gestartet. Es ist sehr einfach für Test

Code hier

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(); 
    } 
} 

Nachdem dieser Code ausgeführt wird, wird die Datenbank leer! Ich sehe keine Fehler im Protokoll.

Hinweis. Die Reinigung der Datenbank erfolgt nur, wenn ich etwas aufzeichnen möchte. werde ich keine Hilfe

EDIT1

Innenanwendungsklasse freuen. Ich benutze diesen Code

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

EDIT2

ja du hast recht Datenbank wird nicht gelöscht!

Log.e("HNotificationService", "empty"); - Es wird nie genannt, und es ist gut

 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(); 

Ein weiterer Grund. Wenn ich auf einen anderen Bildschirm gehe, rufe ich Code

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

Und mPartnersListener wird nie aufgerufen. Es ist sehr seltsam. Wenn IntentService nicht ausgeführt wird. mPartnersListener immer

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

Das sieht normal aus. Wie ist deine Realmkonfiguration? –

+0

siehe EDIT1 –

+0

Wie erkennen Sie, dass der Realm leer ist, nachdem dieser Code ausgeführt wurde? –

Antwort

0

Ich denke, rief ich das Problem herauszufinden! Sie entfernen allChangelisteners in Ihrem IntentService, nachdem Protokolle in diesem Teil.

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

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

und dann tun Sie neue Abfrage, fügen NEW Change und Benachrichtigungen von ihm erhalten möchten, aber nach Benachrichtigung senden, Hörer durch Code oben entfernt.

changelistener zu async geholt RealmResult - richtig, sollte gut funktionieren! entfernen So diesen Block in IntentSevice

realm.removeAllChangeListeners(); 

Auch Ihre Zuhörer sehr seltsam aussieht, sehen coments in Ihrem 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

Ich liebe Problem. Wenn ich Service - ChangeListener arbeite gut arbeiten. wenn ich IntentService benutze - ChangeListener defekt !!! IntentService - Es hat einen separaten Thread. Ich denke, das ist die Ursache von Problemen –

+0

Dienst wird auf demselben Thread ausgeführt, wie es gestartet wird (der UI-Thread). Der IntentService wird auf einem zweiten Looper-Thread ausgeführt. Ich frage mich, ob der Looper die REALM_CHANGED-Nachricht vom UI-Thread irgendwie "stehlen" kann. @ChristianMelchior? – EpicPandaForce

+1

Nein, wir haben eine interne Liste von Realm auf allen Looper-Threads und jeder Looper erhält seine eigene Nachricht. –

0

etwas, das Fehler in diesem Code mich ist, dass Sie die aktuellste Version erhalten sollten des Realmobjekts innerhalb der Transaktion

Ansonsten würde ich versuchen, zu ersetzen die async() Abfrage mit der Sync-Version.

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

auch erwähnenswert, dass Realm.getDefaultInstance().where( dieses Konstrukt bedeutet, dass Sie nie das Reich schließen auf dem UI-Thread können.

EDIT: Sind Sie sicher,

  mResPartners.removeChangeListeners(); 

Probleme in Ihrem Änderungsempfänger nicht dazu führt?

+0

Sie müssen nicht die neueste Version des Realm-Objekts innerhalb der Transaktion erhalten! Die Transaktion muss Code enthalten, der DB-Daten irgendwie ändert und so schnell wie möglich festgelegt wird! –

+0

findAllAsync - Ich rufe viel später an. Hier das Problem mit dem ChangeListener Sie rufen nicht nach IntentService auf. Es ist sehr seltsam!!! –

+0

Haben Sie versucht, was ich gesagt habe, obwohl. – EpicPandaForce