replace method
Implementation
Future<void> replace(DynamicMap replaceData) async {
await initialize();
final cache = <String, DynamicMap>{};
for (final tmp in _documentListeners.entries) {
final trimPath = tmp.key.trimQuery().trimString("/");
if (cache.containsKey(trimPath)) {
continue;
}
final paths = trimPath.split("/");
if (paths.isEmpty) {
continue;
}
final value = _data._readFromPath(paths, 0);
if (value is! Map) {
continue;
}
cache[trimPath] = value.cast<String, dynamic>();
}
for (final tmp in _collectionListeners.entries) {
final trimPath = tmp.key.trimQuery().trimString("/");
final paths = trimPath.split("/");
if (paths.isEmpty) {
continue;
}
final value = _data._readFromPath(paths, 0);
if (value is! DynamicMap) {
continue;
}
final entries = value.toList(
(key, value) {
if (value is! Map) {
return null;
}
return MapEntry(
key,
Map<String, dynamic>.from(value),
);
},
).removeEmpty();
for (final e in entries) {
final path = "$trimPath/${e.key}";
if (cache.containsKey(path)) {
continue;
}
cache[path] = value.cast<String, dynamic>();
}
}
_data = replaceData;
for (final tmp in cache.entries) {
final trimPath = tmp.key;
final paths = trimPath.split("/");
final value = _data._readFromPath(paths, 0);
if (value is! Map) {
// Deleted.
notifyDocuments(
trimPath,
paths.last,
{},
LocalStoreDocumentUpdateStatus.deleted,
LocalStoreDocumentQuery(path: trimPath),
);
} else {
// Add or Modified.
notifyDocuments(
trimPath,
paths.last,
value.cast<String, dynamic>(),
LocalStoreDocumentUpdateStatus.addOrModified,
LocalStoreDocumentQuery(path: trimPath),
);
}
}
await onSaved?.call();
}