根据动态类型获取领域数据

时间:2018-07-12 12:02:31

标签: android realm realm-list

我为employee,Student等实体在领域中创建了以下类,并将其同步状态存储在SyscInfo类中

Employee extends RealmObject      
  _id
  name
  phone
  address
  isSync

Student extends RealmObject      
 _id
 name
 phone
 isSync


SyncInfo extends RealmObject      
  isSync
  timestamp

现在,如果未同步任何员工记录或学生记录,我将syncInfo.isSync设置为false

我的后台调度程序将检查我们是否有任何离线/未同步的数据存储在领域db中。为此,我向员工和学生发出查询。

    RealmList<Employee> offlineEmployeeList = realm.where(Employee.class).equalTo("syncInfo.isSync",false).findAllAsync();
    RealmList<Student> offlineEmployeeList = realm.where(Student.class).equalTo("syncInfo.isSync",false).findAllAsync();

所以我正在寻找的是,我们是否有任何通用的方法来检查离线/未同步的数据,而无需检查每个实体,即员工和学生。 明天,如果再引入一个实体,我将不得不再次发起相同的查询。

1 个答案:

答案 0 :(得分:2)

您可以创建以下通用方法:

private <T extends RealmModel> RealmResults<T> getNotSynced(Class<T> modelClass) {
    return realm.where(modelClass).equalTo("isSynced", false).findAll();
}    

并像这样使用它:

Set<Class<? extends RealmModel>> realmObjectClasses = realm.getConfiguration().getRealmObjectClasses();

ArrayList<RealmResults> notSynched = new ArrayList<>();
for(Class modelClass: realmObjectClasses) {
  notSynched.add(getNotSynced(schemaClasses));
}

// Now you have an array of RealmResults with non-synched RealmObjects

关于查询方法,

我将使用findAll()方法并在后台线程上执行小孔操作,而 findAllAsync(),后来我需要更复杂的同步

更新

如果不是所有RealmObjects都具有isSynced字段,这就是我要做的事情:

RealmObjects有一些限制,但是您可以实现一个空接口,因此我将使用该接口来标识可同步对象,并仅对它们使用getNotSynced方法:

创建一个空接口:

public interface Syncable {}

使用所有可同步的RealmObject对其进行实现:

Employee extends RealmObject implements Syncable {
  ...
}

然后使用它从之前过滤for循环中的类:

for(Class modelClass: realmObjectClasses) {
  if (Syncable.class.isAssignableFrom(modelClass)) {
    notSynched.add(getNotSynced(schemaClasses));
  }
}