2016-10-05 5 views
0

Ich habe ein gemeinsames Projekt, wo ich die Datenbank in Realm anstelle von SQLite geändert habe.Xamarin Realm - wann zu schließen Realm

Mein Problem ist, wenn das Realm in meinem DatabaseManager geschlossen wird, wird das Ergebnis entfernt. Daher habe ich eine statische Singleton-Instanz des Realms erstellt, die alle meine DatabaseManager verwenden. Jetzt stürzt meine App nach kurzer Zeit im Speicher ab, und wenn ich alle meine Datenbank-Funktionen entferne, funktioniert es.

Ich eröffne mein Realm-Instanz hier:

public class RealmDatabase 
{ 
    private Realm mRealmDB; 
    public Realm RealmDB 
    { 
     get 
     { 
      if (mRealmDB == null || mRealmDB.IsClosed) 
      { 
       SetRealm(); 
      } 
      return mRealmDB; 
     } 
    } 

    static RealmDatabase cCurrentInstance; 
    public static RealmDatabase Current 
    { 
     get 
     { 
      if (cCurrentInstance == null) 
       cCurrentInstance = new RealmDatabase(); 

      return cCurrentInstance; 
     } 
    } 

    public RealmDatabase() 
    { 
    } 

    private void SetRealm() 
    { 
     var config = new RealmConfiguration ("DBName.realm", true); 
     mRealmDB = Realm.GetInstance (config); 
    } 

    public Transaction BeginTransaction() 
    { 
     return RealmDB.BeginWrite(); 
    } 
} 

Die Ich habe meine DatabaseManagler wie folgt aussehen:

public class NewFreeUserManager 
{ 
    internal Realm RealmDB = RealmDatabase.Current.RealmDB; 
    static NewFreeUserManager cCurrentInstance; 
    public static NewFreeUserManager Current 
    { 
     get 
     { 
      if (cCurrentInstance == null) 
       cCurrentInstance = new NewFreeUserManager(); 

      return cCurrentInstance; 
     } 
    } 

    private NewFreeUserManager() 
    { 
    } 

    internal bool Save (FreeUser freeuser) 
    { 
     try 
     { 
      using (var trans = RealmDB.BeginWrite()) 
      { 
       RealmDB.RemoveAll<FreeUser>(); 
       var fu = RealmDB.CreateObject<FreeUser>(); 
       fu = freeuser; 
       trans.Commit(); 
      } 
      return true; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine ("FreeUser save: " + e.ToString()); 
      return false; 
     } 
    } 

    internal FreeUser Get() 
    { 
     return RealmDB.All<FreeUser>().FirstOrDefault(); 
    } 
} 

Kann mir jemand helfen?

Antwort

1

Es gibt ein paar Probleme mit Ihrer aktuellen Einrichtung, die Sie daran hindern, Objekte dauerhaft zu speichern.

Die erste und sehr wichtige ist, dass Realm-Instanzen nicht Thread-sicher sind. Das heißt, es wird dringend davon abgeraten, sie als Singletons zu verwenden, es sei denn, Sie sind sicher, dass Sie niemals von einem anderen Thread darauf zugreifen werden.

Die zweite ist subtiler, aber in Ihrer Speichermethode Sie anrufen:

var fu = RealmDB.CreateObject<FreeUser>(); 
fu = freeuser; 

Was sie tut, ist, effektiv, Sie ein Objekt in der Realm erstellen, und die Zuordnung dann die Variable auf ein anderes Objekt . Dadurch werden freeuser Eigenschaften fu nicht zugewiesen, es ersetzt nur eine Referenz durch eine andere. Was Sie suchen ist Realm.Manage so Ihr Code sollte wie folgt aussehen:

using (var trans = RealmDB.BeginWrite()) 
{ 
    RealmDB.Manage(freeuser); 
    trans.Commit(); 
} 

Sobald Sie den zweiten Fehler zu beheben, sollten Sie in der Lage sein, sich zurück und schließen Realm Instanzen gehen, wenn Sie sie nicht mehr benötigen.

Verwandte Themen