gpt4 book ai didi

android - 基于动态类型获取 Realm 数据

转载 作者:行者123 更新时间:2023-11-29 18:48:30 25 4
gpt4 key购买 nike

我在 Realm 中为 employee 、 Student 等实体创建了以下类,并将其同步状态存储在 SyscInfo 类中

Employee extends RealmObject      
_id
name
phone
address
isSync

Student extends RealmObject
_id
name
phone
isSync


SyncInfo extends RealmObject
isSync
timestamp

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

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

    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 有一些限制,但你可以实现一个空接口(interface),所以我会用它来识别可同步对象并只对它们使用 getNotSynced 方法:

创建一个空接口(interface):

public interface Syncable {}

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

Employee extends RealmObject implements Syncable {
...
}

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

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

关于android - 基于动态类型获取 Realm 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51305198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com