首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mobx或redux或与存储库模式和持久本地存储领域或sqlite?

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

Stack Overflow用户
提问于 2021-04-01 01:23:11
回答 4查看 1.1K关注 0票数 4

MobxRedux 通常不会持久化任何数据。在应用程序运行时,他们将维护临时全局状态。

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

问题是:

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

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

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

如有任何答案,我们将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-04-09 22:45:33

实际上,您可以使用存储库模式。

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

代码语言:javascript
复制
    save(group: GroupLocalStorageModel): Promise<boolean> {
        let created;
        this._localStorage.write(() => {
            created = this._localStorage.create<GroupLocalStorageModel>("Group", group);
        });
        return Promise.resolve(true);
    }

此方法将实际将实体保存到所设置的本地存储中。在上面的示例中,我们将group对象保存到与表类似的组集合中。我们使用的是境界,它是非sql的.

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

代码语言:javascript
复制
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动作首先更新我们的数据库,然后更新全局状态。

我们仍然希望使用全局状态,因此我们的视图将根据redux的connect或mobx的observable自动重新呈现。

请参阅有关存储库的更多信息:

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

票数 2
EN

Stack Overflow用户

发布于 2021-04-06 10:34:38

我不太确定您需要什么,但是如果我正确地理解了您,您需要持久化大量的数据,并加载相同的数据,但只需要在批处理中加载。

我相信,这种问题可以用存储库模式和坚实的设计原则来解决。

你需要:

  • 存储类(mobx存储),它保存您的业务逻辑。
  • 存储库类,负责检索和持久化数据。

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

伪码:

代码语言:javascript
复制
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()
   }
}

现在,应用程序数据不应该是一个巨大的对象,而是应该由多个存储区组成,每个存储区负责数据的一部分。例如,您将有一个用于处理待办事项的存储库和存储库,另一个处理通讯簿联系人等的存储库。

增编:

存储库被注入存储区的原因是,您可以轻松地将其替换为其他实现(存储区并不关心数据是如何持久化和检索的),而且单元测试非常容易。

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

票数 3
EN

Stack Overflow用户

发布于 2021-04-03 14:53:28

AFAIK,有两个选择使用sqlite与redux持久化。

  1. 保留-持久化-方形-储存:用维护者自己的话说

默认情况下,redux持久化使用AsyncStorage作为react本机的存储引擎。这是AsyncStorage的一个插入式替代。该图书馆的灵感来自于反应-天然的-平方米-储存。

请记住,要使用此程序,您需要安装一个安装了react-native-sqlite-storage的附加包

  1. redux-持久化-sqlite:用维护者自己的话说

一个redux持久化存储适配器,它可以写入sqlite。这是从https://github.com/prsn/redux-persist-sqlite-storage改编而来的,但是使用了Node.js sqlite3而不是react本机。非常适合由Redux支持的电子应用程序。

更新反应-原生-mmkv:这是由WeChat开发的。正如它在“关于”一节中所说的

一个非常快的键/值存储库,用于响应本机。~比AsyncStorage快30倍!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66897271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档