Mobx和Redux 通常不会持久化任何数据。在应用程序运行时,他们将维护临时全局状态。
我知道在这两个社区中都有redux-persist和mobx-persist包。但不幸的是,这些persisting解决方案看起来一点也不好。它们只使用stringify或serialize (全局状态树),并使用某种键值存储将其持久化。对吗?
问题是:
当这样的应用程序再次打开时,stringified存储将被解析并结构回原来的数据结构(例如JSON),然后完全加载到内存中。我说得对吗?
如果是的话,这是个问题。总是在内存中加载一个完整的“数据库”,也就是“全局状态”,这是不好的。在我的全局状态下,在长数组中过滤数据可能永远不会更快。与在SQLite上查询表相比,对吗?
我一直在为redux或mobx寻找一些用于持久化全局状态的repository-like解决方案。我正在寻找一些解决方案,用于在一些著名的移动数据库(如SQLite或其他移动数据库)上持久化和查询数据。
如有任何答案,我们将不胜感激。
发布于 2021-04-09 22:45:33
实际上,您可以使用存储库模式。
在您的存储库中,您可能有一个save方法。
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都有动作,对吧?
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
发布于 2021-04-06 10:34:38
我不太确定您需要什么,但是如果我正确地理解了您,您需要持久化大量的数据,并加载相同的数据,但只需要在批处理中加载。
我相信,这种问题可以用存储库模式和坚实的设计原则来解决。
你需要:
商店通过构造函数将存储库注入其中。然后,当您调用存储上的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()
}
}现在,应用程序数据不应该是一个巨大的对象,而是应该由多个存储区组成,每个存储区负责数据的一部分。例如,您将有一个用于处理待办事项的存储库和存储库,另一个处理通讯簿联系人等的存储库。
增编:
存储库被注入存储区的原因是,您可以轻松地将其替换为其他实现(存储区并不关心数据是如何持久化和检索的),而且单元测试非常容易。
您还可以有一个根存储,它可以容纳所有其他存储,因此,本质上,您可以在一个地方拥有完整的状态。因此,如果在serialize存储上调用root,它会序列化所有存储并返回一个大对象。
发布于 2021-04-03 14:53:28
AFAIK,有两个选择使用sqlite与redux持久化。
默认情况下,redux持久化使用AsyncStorage作为react本机的存储引擎。这是AsyncStorage的一个插入式替代。该图书馆的灵感来自于反应-天然的-平方米-储存。
请记住,要使用此程序,您需要安装一个安装了react-native-sqlite-storage的附加包
一个redux持久化存储适配器,它可以写入sqlite。这是从https://github.com/prsn/redux-persist-sqlite-storage改编而来的,但是使用了Node.js sqlite3而不是react本机。非常适合由Redux支持的电子应用程序。
更新:反应-原生-mmkv:这是由WeChat开发的。正如它在“关于”一节中所说的
一个非常快的键/值存储库,用于响应本机。~比AsyncStorage快30倍!
https://stackoverflow.com/questions/66897271
复制相似问题