基于动态类型获取领域数据

fetch realm data based on dynamic type

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

Employee extends RealmObject      
  _id
  name
  phone
  address
  isSync

Student extends RealmObject      
 _id
 name
 phone
 isSync


SyncInfo extends RealmObject      
  isSync
  timestamp

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

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

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

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

您可以创建这个泛型方法:

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() 方法并在后台线程上执行 hole 东西, 而不是 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));
  }
}