我需要检查一些数据,是否发送跟踪信息。此数据保存在Realm数据库中。这是模型:
public class RealmTrackedState extends RealmObject {
@PrimaryKey
private int id = 1;
private RealmList<RealmChat> realmChatsStarted;
private boolean isSupportChatOpened;
private boolean isSupportChatAnswered;
/* getters and setters */
}
这个想法是 - 应该跟踪不在realmChatsStarted
内的每个聊天,然后将其添加到此列表中。类似于isSupportChatOpened
布尔值的东西 - 但是由于业务逻辑,这是一个特例。
所以 - 我把它包装在一个Realm对象中。我已将其包含在少数shouldTrack()
方法中,如下所示:
@Override
public void insertOrUpdateAsync(@NonNull final RealmModel object, @Nullable OnInsertListener listener) {
Realm instance = getRealmInstance();
instance.executeTransactionAsync(realm -> realm.insertOrUpdate(object), () ->
notifyOnSuccessNclose(listener, instance),
error -> notifyOnErrorNclose(listener, error, instance));
}
@Override
public RealmTrackedState getRealmTrackedState() {
try (Realm instance = getRealmInstance()) {
RealmResults<RealmTrackedState> trackedStates = instance.where(RealmTrackedState.class).findAll();
if (!trackedStates.isEmpty()) {
return instance.copyFromRealm(trackedStates.first());
}
RealmTrackedState trackedState = new RealmTrackedState();
trackedState.setRealmChatsStarted(new RealmList<>());
insertOrUpdateAsync(trackedState, null);
return trackedState;
}
}
@Override
public boolean shouldTrackChatStarted(@NonNull RealmChat chat) {
if (getCurrentUser().isRecruiter()) {
return false;
}
RealmList<RealmChat> channels = getRealmTrackedState().getRealmChatsStarted();
for (RealmChat trackedChats : channels) {
if (trackedChats.getId() == chat.getId()) {
return false;
}
}
getRealmInstance().executeTransaction(realm -> {
RealmTrackedState realmTrackedState = getRealmTrackedState();
realmTrackedState.addChatStartedChat(chat);
realm.insertOrUpdate(realmTrackedState);
});
return true;
}
对于RealmTrackedState模型中的任何其他字段也是如此。 因此,在演示者课程中,我发射了一首曲目,我有这个:
private void trackState(){
if(dataManager.shouldTrackChatStarted(chatCache)){
//track data
}
if(dataManager.shouldTrackSupportChatOpened(chatCache)){
//track data
}
if(dataManager.shouldTrackWhatever(chatCache)){
//track data
}
...
}
我想知道:
一个。这会对性能产生多大影响。
我是Realm的新手,但对我来说,打开和关闭数据库看起来很重。
我喜欢在这个实现中,每个should(...)
方法都是独立的。即使我连续发布其中三个 - 在其他情况下,我可能只使用一个。
然而,获得这个主要对象一次然后对其进行操作会更明智吗?听起来像。
湾我看到我可以操作同步和异步事务。我担心堆叠一系列同步事务可能会阻塞CPU,并且使用一系列异步可能会导致意外行为。
℃。 @PrimaryKey
- 由于野外复制粘贴会话,我使用了这个。假设这个类应该只有实例 - 这是一个正确的方法吗?
答案 0 :(得分:0)
ad a。
Realm缓存实例,因此打开和关闭实例并不像听起来那么昂贵。第一次应用程序打开Realm文件时,会执行一些一致性检查(主要是模型类匹配磁盘上的类)但下次打开实例时,您不会进行此检查。
ad b。
如果您的交易相互依赖,您可能需要小心。另一方面,为什么要进行多笔交易?异步事务会在完成后通知您,这可以帮助我获得您的行为。
ad c。
更新对象(使用insertOrUpdate()
)时,主键很有用,因为该值用于决定您是创建/插入还是更新对象。