使用 mobx 或 redux 或使用存储库模式和持久本地存储领域或 sqlite?
Use mobx or redux or with repository pattern and persistent local storage realm or sqlite?
Mobx 和 Redux 通常不会保留 任何数据。当应用处于 运行.
时,它们将保持 临时 全局状态
我知道这两个社区中都有 redux-persist
和 mobx-persist
软件包。但不幸的是,这些 persisting
解决方案似乎一点都不好。他们只有 stringify
或 serialize
一个全局状态树,并使用某种键值存储来持久化它。对吗?
问题:
当再次打开此类应用程序时,stringified
存储将被解析并构造回其原始数据结构(例如,JSON),然后完全加载到 RAM 内存中。 我说得对吗?
如果是,这就是问题所在。总是在内存中加载一个完整的“数据库”也就是“全局状态”是不好的。在我的全局状态中过滤长数组中的数据可能永远不会更快......与在 SQLite 上查询 table 相比,对吧?
我一直在寻找一些类似于 repository
的解决方案来为 redux 或 mobx 持久化全局状态。我正在寻找一些解决方案,用于在一些著名的移动数据库(如 SQLite 或其他数据库)上持久化和查询数据。
任何答案将不胜感激。
据我所知,将 sqlite 与 redux persist 结合使用有两种选择。
- 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
- 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 hydrated
或 cubit 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
Mobx 和 Redux 通常不会保留 任何数据。当应用处于 运行.
时,它们将保持 临时 全局状态我知道这两个社区中都有 redux-persist
和 mobx-persist
软件包。但不幸的是,这些 persisting
解决方案似乎一点都不好。他们只有 stringify
或 serialize
一个全局状态树,并使用某种键值存储来持久化它。对吗?
问题:
当再次打开此类应用程序时,stringified
存储将被解析并构造回其原始数据结构(例如,JSON),然后完全加载到 RAM 内存中。 我说得对吗?
如果是,这就是问题所在。总是在内存中加载一个完整的“数据库”也就是“全局状态”是不好的。在我的全局状态中过滤长数组中的数据可能永远不会更快......与在 SQLite 上查询 table 相比,对吧?
我一直在寻找一些类似于 repository
的解决方案来为 redux 或 mobx 持久化全局状态。我正在寻找一些解决方案,用于在一些著名的移动数据库(如 SQLite 或其他数据库)上持久化和查询数据。
任何答案将不胜感激。
据我所知,将 sqlite 与 redux persist 结合使用有两种选择。
- 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
- 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 hydrated
或 cubit 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