2017-11-22 6 views
0

ich eine Ausnahme habe assoziiert zu löschen, wenn i Realm.deleteRealm (config) nennen:Illegal: Es ist nicht erlaubt, die Datei mit einem offenen Realm

java.lang.IllegalStateException: Es ist nicht das Löschen erlaubt Datei mit einem offenen Realm verbunden. Denken Sie daran, zu schließen() alle Instanzen des Realm vor der Datei zu löschen

ich dies nach Realm.init einfach anrufen() in Application.onCreate, so gibt es keinen Grund, andere Instanzen geöffnet zu haben.

public void onCreate() { 
    Realm.init(this); 

    Realm realm; 
    RealmConfiguration config = getConfig(); 
    try { 
     realm = Realm.getInstance(config); // Will migrate if needed 
    } 
    catch (RealmMigrationNeededException e) 
    { 
     Realm.deleteRealm(config); 
     realm = Realm.getInstance(config); 
    } 
} 

sah ich Thesen Themen, aber die Lösung nicht sehen:

https://github.com/realm/realm-java/issues/4552

https://github.com/realm/realm-java/issues/5416

Edit:

Ich glaube, mein Problem ist, wenn ich Anwendung neu starten Fehlgeschlagene Migration versuchen. In der Anwendung habe ich Instanzen geöffnet, aber nicht geschlossen, und kann sie nicht einfach schließen, Code ist zu komplex. Und wenn ich die Anwendung neu starte, um die Migrationsausnahme zu testen, indem ich ein Feld zu Modellen hinzufüge, werden möglicherweise einige Instanzen vom vorherigen Start geöffnet.

Edit 2:

Ich versuchte, diese Welt zu kommen zurück 3.0.0 (meine frühere Version), und ich habe nicht diesen Illegal. Ich verwende derzeit 4.2.0.

Vielleicht vermissen ich etwas in Changelog ..

Antwort

1

Vor Reich-java 4.1.0, Realm.deleteRealm() ist kein prozesssichere Anruf. Es bedeutet, dass es nicht geworfen wird, wenn Realm-Instanzen in anderen Prozessen geöffnet sind. Das Löschen von Realm-Instanzen hat jedoch eine große Chance, die DB-Datei zu beschädigen.

Von 4.1.0, Realm.deleteRealm() ist eine Multi-Prozess-sichere API. Es wird ausgelöst, wenn es erkennt, dass Realm-Instanzen in anderen Prozessen/Threads geöffnet sind.

Überprüfen Sie bitte, ob Sie Realm in dem anderen Prozess verwenden und diese nicht ordnungsgemäß geschlossen werden, bevor Sie deleteRealm() aufrufen.

+0

Ja thx @beeender, du hast mir auf github geantwortet, ich habe vergessen diesen Stack zu schließen. https://github.com/realm/realm-java/issues/5570 – Lyofen

0

Sie

public void onCreate() { 
    Realm.init(this); 

    Realm realm; 
    RealmConfiguration config = getConfig(); 
    try { 
     realm = Realm.getInstance(config); // Will migrate if needed 
    } 
    catch (RealmMigrationNeededException e) 
    { 
     realm.close(); 
     Realm.deleteRealm(config); 
     realm = Realm.getInstance(config); 
    } 
} 

statt

public void onCreate() { 
     Realm.init(this); 

     Realm realm; 
     RealmConfiguration config = getConfig(); 
     try { 
      realm = Realm.getInstance(config); // Will migrate if needed 
     } 
     catch (RealmMigrationNeededException e) 
     { 
      Realm.deleteRealm(config); 
      realm = Realm.getInstance(config); 
     } 
    } 
+0

Nein, es funktioniert nicht = ( Ich glaube, mein Problem ist, wenn ich Anwendung neu starten Migration versuchen, scheitern. In Anwendung ich habe geöffnet Fälle aber nicht geschlossen, und leicht sie nicht schließen kann, Code zu viel komplexer ist. Und wenn ich die Anwendung neu starte, um die Migrationsausnahme zu testen, wenn ich ein Feld zu Modellen hinzufüge, dann sind vielleicht einige Instanzen vom vorherigen Start geöffnet. – Lyofen

+0

Können Sie versuchen, Realm zu öffnen? = null) { Realm exRealm = Realm.getInstance (rc); exRealm.close(); } ' – dralexnumber

+0

immer noch funktioniert nicht, ich werde versuchen, zur vorherigen Version zurückzukehren, um zu testen, ich denke, es stürzte nicht so ab – Lyofen

0

Ich habe eine Antwort von diesem Thema verwenden: Wenn https://github.com/realm/realm-java/issues/4552

Sie kennen die Migration von Version N auf Version N Wenn Sie diese IllegalStateException auslösen, können Sie DynamicRealm verwenden, um Version und deleteRealm bei Bedarf zu überprüfen.

Weitere Details in Thema.

0

Fügen Sie folgende Zeile hinzu, bevor Sie die Realmkonfiguration löschen.

realm.close(); 
+0

Wie dralexnumber Lösung, in der Nähe zu fangen? Es funktionierte nicht – Lyofen

+0

@Lyofen Ich benutze 3.7.0 Version und es funktioniert für mich. probier mal mit dieser Version – Aks4125

Verwandte Themen