2016-10-05 79 views
0

我有一個共享項目,我已將數據庫更改爲Realm而不是SQLite。Xamarin Realm - 何時關閉Realm

我的問題是,如果我關閉我的DatabaseManager領域,結果被刪除。因此,我創建了Realm的靜態singelton實例,這是我所有的DatabaseManager使用的。現在我的應用在內存短時間後崩潰了,如果我刪除了所有的數據庫函數,它就可以工作。

我在這裏創建我的領域,例如:

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

一旦你解決第二個錯誤,你應該能夠回去密切領域實例,當你不需要他們了。