Firebase Firestore 是否保留快照的本地副本
Does Firebase Firestore keep a local copy of snapshot
我正在为我的聊天室应用程序使用 firebase firestore。
我有一个功能可以将消息发送到 firebase
const sendMessageHandler = message => {
if (message) {
firestore()
.collection(`ChatRooms/${roomId}/messages`)
.doc(moment().format('YYYY-MM-DD-HH-mm-sssss'))
.set({
message: Encrypt(message),
userId: userId,
});
}
};
并且我正在从 firestore as
中仅将消息提取到 flatlist
// this messages const is getting data only from firestore
const [messages, setMessage] = useState([]);
firestore()
.collection(`ChatRooms/${roomId}/messages`)
.onSnapshot(
querySnapshot => {
const messages = [];
querySnapshot.forEach(dataSnapshot => {
messages.push({
id: dataSnapshot.id,
message: dataSnapshot.data().message,
userId: dataSnapshot.data().userId,
});
});
setMessage(messages.reverse());
setLoading(false);
},
error => {
console.log('error : ', error);
},
);
// And now I am using this messages somewhere in return function of a component as :
<FlatList
data={messages}
renderItem={flatListItemRenderer}
inverted={true}
/>
注意 我只从 firestore 获取而不是本地获取。
现在我关闭了互联网并尝试发送消息所以发生了这种情况
数据还没有更新到firestore(当然是因为没有网络),但是flatlist已经用新消息更新了!!
我能想到的唯一可能是firestore的setter方法是在本地和远程数据库中存储数据,而getter方法是先从本地数据库获取快照,然后从远程获取快照数据库。
所以问题是 @react-native-firebase/firestore
是否也保留本地快照并在我们更改某些内容时同时更新本地和远程数据快照?
编辑:
Firestore docs 说
Firestore 提供开箱即用的离线功能支持。读取和写入数据时,Firestore 使用本地数据库自动同步 server.This 功能默认启用,但如果您需要禁用它可以禁用它
我尝试关闭持久性,但这 属性 与离线存储数据有关,而不是状态。即,现在当我的应用程序加载时,它直接从服务器获取所有数据(之前从存储和服务器获取),但是平面列表仍然使用新消息更新(也许它也在存储一些像 useState 这样的状态???)
Firestore SDK 保留以下内容的本地副本:
- 您有活跃侦听器的所有数据。
- 所有待处理的写入。
此外,如果启用离线持久化,它还会保留您的代码最近读取的数据的本地副本。
当您进行写入操作时,SDK:
- 将您的操作写入其待处理写入队列。
- 为任何本地侦听器触发事件。
- 尝试将挂起的写入与服务器同步。
第 1 步和第 2 步总是会发生,无论您是在线还是离线。只有第 3 步在您离线时不会立即完成。
我正在为我的聊天室应用程序使用 firebase firestore。
我有一个功能可以将消息发送到 firebase
const sendMessageHandler = message => {
if (message) {
firestore()
.collection(`ChatRooms/${roomId}/messages`)
.doc(moment().format('YYYY-MM-DD-HH-mm-sssss'))
.set({
message: Encrypt(message),
userId: userId,
});
}
};
并且我正在从 firestore as
中仅将消息提取到 flatlist// this messages const is getting data only from firestore
const [messages, setMessage] = useState([]);
firestore()
.collection(`ChatRooms/${roomId}/messages`)
.onSnapshot(
querySnapshot => {
const messages = [];
querySnapshot.forEach(dataSnapshot => {
messages.push({
id: dataSnapshot.id,
message: dataSnapshot.data().message,
userId: dataSnapshot.data().userId,
});
});
setMessage(messages.reverse());
setLoading(false);
},
error => {
console.log('error : ', error);
},
);
// And now I am using this messages somewhere in return function of a component as :
<FlatList
data={messages}
renderItem={flatListItemRenderer}
inverted={true}
/>
注意 我只从 firestore 获取而不是本地获取。
现在我关闭了互联网并尝试发送消息所以发生了这种情况
数据还没有更新到firestore(当然是因为没有网络),但是flatlist已经用新消息更新了!!
我能想到的唯一可能是firestore的setter方法是在本地和远程数据库中存储数据,而getter方法是先从本地数据库获取快照,然后从远程获取快照数据库。
所以问题是 @react-native-firebase/firestore
是否也保留本地快照并在我们更改某些内容时同时更新本地和远程数据快照?
编辑:
Firestore docs 说
Firestore 提供开箱即用的离线功能支持。读取和写入数据时,Firestore 使用本地数据库自动同步 server.This 功能默认启用,但如果您需要禁用它可以禁用它
我尝试关闭持久性,但这 属性 与离线存储数据有关,而不是状态。即,现在当我的应用程序加载时,它直接从服务器获取所有数据(之前从存储和服务器获取),但是平面列表仍然使用新消息更新(也许它也在存储一些像 useState 这样的状态???)
Firestore SDK 保留以下内容的本地副本:
- 您有活跃侦听器的所有数据。
- 所有待处理的写入。
此外,如果启用离线持久化,它还会保留您的代码最近读取的数据的本地副本。
当您进行写入操作时,SDK:
- 将您的操作写入其待处理写入队列。
- 为任何本地侦听器触发事件。
- 尝试将挂起的写入与服务器同步。
第 1 步和第 2 步总是会发生,无论您是在线还是离线。只有第 3 步在您离线时不会立即完成。