概括了使用C#中的泛型获取和更新数据的方法

时间:2017-05-17 12:00:58

标签: c# generics xamarin xamarin.forms realm

我正在尝试使用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#

所以有人可以建议如何解决这个问题

Find<T>无效 enter image description here

2 个答案:

答案 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