使用 mobx 或 redux 或使用存储库模式和持久本地存储领域或 sqlite?

Use mobx or redux or with repository pattern and persistent local storage realm or sqlite?

MobxRedux 通常不会保留 任何数据。当应用处于 运行.

时,它们将保持 临时 全局状态

我知道这两个社区中都有 redux-persistmobx-persist 软件包。但不幸的是,这些 persisting 解决方案似乎一点都不好。他们只有 stringifyserialize 一个全局状态树,并使用某种键值存储来持久化它。对吗?

问题:

当再次打开此类应用程序时,stringified 存储将被解析并构造回其原始数据结构(例如,JSON),然后完全加载到 RAM 内存中。 我说得对吗?

如果是,这就是问题所在。总是在内存中加载一个完整的“数据库”也就是“全局状态”是不好的。在我的全局状态中过滤长数组中的数据可能永远不会更快......与在 SQLite 上查询 table 相比,对吧?

我一直在寻找一些类似于 repository 的解决方案来为 redux 或 mobx 持久化全局状态。我正在寻找一些解决方案,用于在一些著名的移动数据库(如 SQLite 或其他数据库)上持久化和查询数据。

任何答案将不胜感激。

据我所知,将 sqlite 与 redux persist 结合使用有两种选择。

  1. redux-persist-sqlite-storage:由维护者自己的话

By default redux-persist uses AsyncStorage as storage engine in react-native. This is a drop-in replacemet of AsyncStorage. The library is inspired by react-native-sqlite-storage.

请记住,要使用它,您需要安装一个额外的软件包 react-native-sqlite-storage

  1. redux-persist-sqlite:由维护者自己的话

A redux-persist storage adapter that writes to sqlite. This is adapted from https://github.com/prsn/redux-persist-sqlite-storage, but uses Node.js sqlite3 rather than react-native. Great for Electron apps that are backed by Redux.

UPDATE: react-native-mmkv : 这是微信开发的。正如它在其关于部分

中所说

An extremely fast key/value storage library for React Native. ~30x faster than AsyncStorage!

我不太确定你需要什么,但如果我理解正确的话,你需要持久化大量数据,并且还需要加载相同的数据,但仅限于 批次.

我相信这种问题可以通过 repository pattern 和 SOLID 设计原则来解决。

您将需要:

  • store class(mobx store)保存你的业务逻辑。

  • 存储库class,负责检索和保存数据。

商店通过构造函数将存储库注入其中。 然后,当您在商店中调用 initialize 方法时,它会与存储库对话并检索初始数据。现在,初始数据可以只是所有持久化数据的一个子集。您可以在存储和存储库上实现某种分页,以根据需要分批检索数据。稍后您可以根据需要调用其他方法来加载和保存其他数据。

伪代码:

class Repository(){
  initialize()// load the first batch
  load(next 10 models)
  save(data)
}

class Store{
   constructor(repository)
   initialize(){
      repository.initialize()
   }
   load(){
      repository.load()
   }
   
   save(){
      repository.save()
   }
}

现在你的应用程序数据不应该是一个巨大的对象,而应该由多个商店组成,每个商店负责一部分数据。例如,您将有一个存储和存储库用于处理 todos 和另一对处理 地址簿联系人

附录:

将存储库 注入 到存储中的原因是您可以轻松地将它换成其他实现(存储不关心数据是如何保存和检索的)而且,单元测试非常简单。

您还可以有一个 root 存储,它可以容纳所有其他存储,因此从本质上讲,您可以在一个地方拥有完整的状态。因此,如果您在 root 存储上调用 serialize,它会序列化所有存储和 returns 一个大对象。

我认为最好的解决方案是来自 flutter_bloc.

bloc hydratedcubit hydrated

https://pub.dev/packages/hydrated_bloc

在后台它使用 Hive DB,非常高性能的 DB,并且只有键存储在内存中,因此它不应该像 SQLite 那样给应用程序增加巨大的膨胀。 如果您可以在 blocks/cubits 中创建所有 APP 逻辑,那么额外的 DB 调用将是无关紧要的。

您确实可以使用存储库模式。

在您的存储库中,您可能有一个 save 方法。

    save(group: GroupLocalStorageModel): Promise<boolean> {
        let created;
        this._localStorage.write(() => {
            created = this._localStorage.create<GroupLocalStorageModel>("Group", group);
        });
        return Promise.resolve(true);
    }

此方法会将您的实体直接保存到您设置的某个本地存储中。在上面的示例中,我们将 group 对象保存到类似于表的组集合中。我们正在使用 realm,它不是-sql。

一旦你有了你的存储库,如果你使用的是 redux 或 mobx,你可能会在你的操作中调用你的 save 方法。 redux 和 mobx 都可以使用 action,对吧?

export const GroupStoreModel = types
    .model("GroupStore")
    .props({
        groups: types.optional(types.array(GroupModel), []),
    })
    .extend(withEnvironment)
    .actions((self) => {
        return ({
            _addGroupToStore(group: GroupLocalStorageModel) {
                self.groups.push(group)
            },
            _deleteAllFromStore() {
                self.groups.clear()
            },
            _addGroupsToStoreBatch: (groups: GroupLocalStorageModel[]) => {
                self.groups.concat(groups);
            },
        })
    })
    /* Async actions */
    .actions((self) => {
        let groupRepository = self.environment.groupRepository;
        return ({
            addGroup(group: GroupLocalStorageModel) {
                groupRepository.save(group).then(result => self._addGroupToStore(group))
            },
            getAllGroupsPaginated(page: number) {
                groupRepository.getAllPaginated(page).then(groups => self._addGroupsToStoreBatch(groups));
            },
            deleteAll() {
                groupRepository.deleteAll();
                self._deleteAllFromStore();
            }
        })
    })

在这个例子中,我们使用 mobx-state-tree。这个 addGroup 操作将首先更新我们的数据库,然后也更新全局状态。

我们仍然想使用我们的全局状态,这样我们的视图将根据 connect for redux 或 observable for mobx 自动重新渲染。

在存储库中查看更多信息:

https://github.com/Hadajung/poc-react-native-database-example