领域 - 对同一对象的多个操作。我的实施是否达到了性能?

时间:2017-03-27 08:44:53

标签: java android performance realm

我需要检查一些数据,是否发送跟踪信息。此数据保存在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 - 由于野外复制粘贴会话,我使用了这个。假设这个类应该只有实例 - 这是一个正确的方法吗?

1 个答案:

答案 0 :(得分:0)

ad a。

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

ad b。

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

ad c。

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