2016-10-05 5 views
0

У меня есть общий проект, где я изменил базу данных в Realm вместо SQLite.Xamarin Realm - когда закрыть Realm

Моя проблема: если я закрою Realm в моем DatabaseManager, результат будет удален. Поэтому я создал статический Singelton-экземпляр Realm, который использует весь мой DatabaseManager. Теперь мое приложение падает после короткого времени в памяти, и если я удалю все мои функции базы данных, это сработает.

Я создаю мой Realm-экземпляр здесь:

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

Я мой DatabaseManagler глядя, как это:

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

Может кто-нибудь мне помочь?

ответ

1

есть несколько проблем с вашей текущей настройкой, которые предотвращают вас от сохраняющихся объектов должным образом.

Первым и очень важным является то, что экземпляры Realm не являются потокобезопасными. То есть, использование их в качестве синглонов сильно обескуражено, если вы не уверены, что никогда не сможете получить к ним доступ из другого потока.

Второй является более тонким, но в вашем сохранить метод вы звоните:

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

Что она делает это, по сути, вы создаете объект в области, а затем присвоение переменной к другому объекту , Это не присваивает freeuser свойствам fu, оно просто заменяет одну ссылку на другую. То, что вы ищете, Realm.Manage так что ваш код должен выглядеть следующим образом:

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

После того, как вы исправить вторую ошибку, вы должны быть в состоянии вернуться и экземпляры близко Realm, когда вы не нуждаетесь в них больше.

Смежные вопросы