基于动态类型获取领域数据
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));
}
}
我在领域中为 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));
}
}