android - 根据动态类型获取领域数据
问题描述
我在领域中为员工、学生等实体创建了以下类,并将其同步状态存储在 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();
所以我正在寻找的是,我们是否有任何通用方法来检查离线/未同步数据,而无需检查每个实体,即员工和学生。明天如果再引入一个实体,我将再次触发相同的查询。
解决方案
您可以创建此通用方法:
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));
}
}
推荐阅读
- python - wxPython:有没有办法在 wx.dataview.DataViewListCtrl 的列标题中显示排序箭头指示符?
- mysql - 如何选择 column2 但如果 column2 为零则选择 column1
- javascript - Vue.js - 如何在函数中使用数组进行循环
- c# - SSIS C# HTTP GetAsync 不等待响应
- python - Pyqt5 使 QSplitter 处理丰富多彩/可区分
- prolog - 在 Prolog 中定义“let 表达式”
- javascript - 如何在节点中调用调用序列-> Express ^4.14
- django - 如何在模板(django)中显示在线好友总数?
- android - Recyclerview 的问题。recyclerview.xml 不能为空
- android - Android:Imageview在上面对象的高度被改变时被调整大小