我有一个共享项目,我已将数据库更改为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 ();
}
}
任何人都可以帮助我吗?
答案 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实例时返回并关闭它们。