首页 > 解决方案 > 根据动态类型获取领域数据

问题描述

我在领域中为员工、学生等实体创建了以下类,并将其同步状态存储在 SyscInfo 类中

Employee extends RealmObject      
  _id
  name
  phone
  address
  isSync

Student extends RealmObject      
 _id
 name
 phone
 isSync


SyncInfo extends RealmObject      
  isSync
  timestamp

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

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

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

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

标签: androidrealmrealm-list

解决方案


您可以创建此通用方法:

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 {}

用所有可同步的 RealmObjects 实现它:

Employee extends RealmObject implements Syncable {
  ...
}

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

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

推荐阅读