我正在尝试使用xamarin.forms中的域在服务器上成功同步记录时为updateData创建generlize方法
private void updateContactData<T>(Realm realm, IList<T> dataList) where T : RealmObject , IMaster
{
realm.WriteAsync(tempRealm =>
{
try
{
foreach (IMaster data in dataList)
{
IMaster dbData = null;
if (data.status.Equals(CREATED))
{
dbData = tempRealm.Find<T>(data.mId);
dbData.Id = data.Id;
dbData.syncInfo.isSync = SyncStatus.SYNCED;
}
else if (data.status.Equals(UPDATED))
{
// dbData = tempRealm.All<T>().FirstOrDefault(c => c.Id == data.Id);
dbData = tempRealm.All<T>().Where(c => c.Id == data.Id).FirstOrDefault();
dbData.Id = data.Id;
dbData.syncInfo.isSync = SyncStatus.SYNCED;
}
else if (data.status.Equals(ERROR))
{
if (!String.IsNullOrEmpty(dbData.mId))
{
dbData = tempRealm.Find<T>(data.mId);
}
else
{
dbData = tempRealm.All<T>().Where(c => c.Id == data.Id).FirstOrDefault();
}
dbData.syncInfo.errorMessage = data.errorMessage;
dbData.syncInfo.isSync = SyncStatus.NOT_SYNCED;
}
}
}catch(Exception e)
{
Debug.WriteLine("Error hi " + e.Message);
}
});
}
我的一个联系模式
public class Contact : RealmObject , IMaster
{
public long contactId { set; get; } = 0;
[PrimaryKey]
public String mContactId { get; set; } = Guid.NewGuid().ToString();
public SyncInfo syncInfo { get; set; }
public String contactStatus { get; set; }
public long Id
{
get
{
return contactId;
}
set
{
contactId = value;
}
}
public string mId
{
get
{
return mContactId;
}
set
{
mContactId = value;
}
}
public string status
{
get
{
return contactStatus;
}
set
{
contactStatus = value;
}
}
}
IMaster的界面定义,将由所有其他模型实施
public interface IMaster
{
long Id { get; set; }
String mId { get; set; }
SyncInfo syncInfo { get; set; }
String status { get; set; }
String errorMessage { get; set; }
}
问题出在updateData函数的第tempRealm.All<Contact>()
行,我不能在这里推广数据,即我不能使用tempRealm.All<T>()
或tempRealm.All<IMaster>()
,因为IMaster是一个接口,它不是派生的来自RealmObject
。
可以在android中使用T dbInsertable = realm.where((Class<T>)insertable.getClass()).findFirst();
但不确定怎么做C#
所以有人可以建议如何解决这个问题
答案 0 :(得分:2)
如果我理解......
尝试这个(将T约束添加到RealmObject):
private async void updateData<T>(Realm realm, IList<T> dataList) where T : RealmObject, IMaster, new()
{
await realm.WriteAsync(tempRealm =>
{
foreach (IMaster data in dataList)
{
IMaster dbData = null;
if (data.getStatus().Equals("CREATED"))
{
// Problem is here at tempRealm.All<Contact>() i am not able to generlize the fetching of objects
dbData = tempRealm.Find<T>(data.getmId());
//you need to put these properties in IMaster (id, syncInfo)
dbData.id = data.id;
dbData.syncInfo.isSync = SyncStatus.SYNCED;
}
}
});
}
答案 1 :(得分:2)
您获得此异常的原因是因为您的Contact
类具有Id
属性的自定义getter和setter,它指示Realm在生成数据库模式时忽略它。您无法通过忽略的属性进行查询,因为最终查询是在数据库级别执行的,并且它不知道该属性。由于当前实现只是将一个属性代理到另一个属性,最简单的解决方案是删除contactId
并改为使用Id
。