【问题标题】:fetch realm data based on dynamic type根据动态类型获取领域数据
【发布时间】:2018-07-12 12:02:30
【问题描述】:

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

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();

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

【问题讨论】:

  • 如果你想把EmployeeStudent一样对待,那么它们应该是同一个类:Person。并且员工/学生应该是 Person 的type

标签: android realm realm-list


【解决方案1】:

你可以创建这个通用方法:

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));
  }
}

【讨论】:

  • 这很好,但问题又是一样的,我必须为每个实体调用它。 getNotSynced(Contact.class) 用于所有其他实体
  • 我明白了.. 编辑了我的答案。
  • 我已经通过处理异常Invalid query: field 'syncInfo' not found in class 'XXX 使用了您的方法,因为并非所有领域类都有此字段
  • 酷.. 这是一种方法,如果你愿意,我可以建议另一种方法。不过我有一个问题.. 字段名称是isSync,你为什么使用syncInfo?这不是 RealmObjects 之一的名字吗?
  • 哎呀..我想我倒退了..应该是 if(Syncable.class.isAssignableFrom(modelClass))。已编辑。对不起:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多