2016-10-05 74 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(); 
} 

一旦你解决第二个错误,你应该能够回去密切领域实例,当你不需要他们了。