writeWithSyncMultiple method
void
writeWithSyncMultiple(})
Performs a write operation on multiple objects and automatically updates their sync_updated_at fields, marks them for sync, and creates DBCache entries.
Usage:
realm.writeWithSyncMultiple(
[goal1, goal2],
userId: 'user-123',
collectionName: 'goals',
() {
goal1.title = "Updated 1";
goal2.title = "Updated 2";
// sync_updated_at is automatically set for both
},
);
Implementation
void writeWithSyncMultiple(
List<RealmObject> objects, {
required String userId,
required String collectionName,
required void Function() writeCallback,
}) {
write(() {
// Capture old states for all objects
final oldStates = <RealmObject, Map<String, dynamic>>{};
for (final obj in objects) {
try {
oldStates[obj] = RealmJson.toJsonWith(obj, null);
} catch (e) {
// Serialization failed, skip
}
}
// Apply user's modifications
writeCallback();
// Update sync metadata and create DBCache entries
final now = DateTime.now().millisecondsSinceEpoch;
for (final obj in objects) {
obj.updateSyncTimestamp(timestampOverride: now);
obj.markForSync();
// Create DBCache entry
try {
final newData = RealmJson.toJsonWith(obj, null);
final entityId = _extractEntityId(obj);
if (entityId != null) {
final oldData = oldStates[obj] ?? {};
final isInsert = oldData.isEmpty;
// For inserts, store full data; for updates, store diff
final diffData = isInsert ? newData : diff(oldData, newData);
// Only create DBCache if there are actual changes
if (diffData.isNotEmpty) {
final key = '$userId|$collectionName|$entityId';
final dbCache = SyncDBCache(
key,
userId,
collectionName,
entityId,
jsonEncode(canonicalizeMap(diffData)),
jsonEncode(canonicalizeMap(newData)),
isInsert ? 'inserted' : 'modified',
createdAt: DateTime.now(),
);
add<SyncDBCache>(dbCache, update: true);
}
}
} catch (e) {
// Log diff caching failures for debugging
try {
// ignore: avoid_print
print(
'DBCache creation failed for $collectionName|${_extractEntityId(obj)}: $e',
);
} catch (_) {}
}
}
});
}