gpt4 book ai didi

java - Realm - 对同一对象的多个操作。我的实现是否会影响性能?

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:19 25 4
gpt4 key购买 nike

我需要检查一些数据,是否发送跟踪信息。该数据保存在 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 boolean 值类似 - 但由于业务逻辑,这是一个特殊情况。

所以 - 我将其包装在一个 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
}

...

}

我想知道:A。这会对性能产生多大影响。我是 Realm 的新手,但对我来说,打开和关闭数据库看起来……很沉重。我喜欢这个实现中的每个 should(...) 方法都是独立的。尽管我连续启动其中三个 - 在其他情况下我可能只会使用一个。然而,获取这个主要对象一次然后对其进行操作会更明智吗?听起来是这样。

b.我发现我可以操作同步和异步事务。我担心堆叠一系列同步事务可能会阻塞 CPU,而使用一系列异步事务可能会导致意外行为。

c. @PrimaryKey - 我使用它是因为狂野的复制粘贴 session 。假设此类应该只有实例 - 这是执行此操作的正确方法吗?

最佳答案

广告。

Realm 缓存实例,因此打开和关闭实例并不像听起来那么昂贵。应用程序第一次打开 Realm 文件时,会执行许多一致性检查(主要是模型类是否与磁盘上的类匹配),但下次打开实例时,不会执行此检查。

广告b。

如果您的交易相互依赖,您可能必须小心。另一方面,为什么要进行多次交易?异步事务将在完成时通知您,这可以帮助我获得您除外的行为。

广告c。

当您更新对象(使用 insertOrUpdate())时,主键非常有用,因为该值用于决定您是要创建/插入还是更新对象。

关于java - Realm - 对同一对象的多个操作。我的实现是否会影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43041721/

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