Xamarin王国 - 何时关闭王国

时间:2016-10-05 12:24:19

标签: xamarin realm

我有一个共享项目,我已将数据库更改为Realm而不是SQLite。

我的问题是,如果我在DatabaseManager中关闭Realm,结果将被删除。因此我创建了一个Realm的静态singelton实例,我的所有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 个答案:

答案 0 :(得分:1)

您当前的设置存在一些问题,导致您无法正确保留对象。

第一个也是非常重要的一个是Realm实例不是线程安全的。也就是说,强烈建议不要将它们用作单身人士,除非你确定你永远不会从另一个线程访问它们。

第二个更精细,但在你的保存方法中,你打电话:

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

它的作用是,有效地,您在Realm中创建一个对象,然后将该变量分配给另一个对象。这不会将freeuser的属性分配给fu,它只会将一个引用替换为另一个引用。您正在寻找的是Realm.Manage,因此您的代码应如下所示:

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

修复第二个错误后,您应该能够在不再需要Realm实例时返回并关闭它们。