Flutter跨端应用使用drift本地DB:查询未同步任务的最优方式及调用次数疑问
解决方案:优先选择单次查询后在代码中拆分
对于你的场景,推荐编写单个Drift查询获取所有未同步记录,再在代码中按优先级拆分,原因如下:
- 性能更优:哪怕是本地数据库,多次异步IO调用也会累积调度和IO开销,单次查询能把磁盘IO操作降到最少,后续内存中的分组拆分开销远低于多次数据库调用的额外成本。尤其是当未同步任务数量较多时,这种差异会更明显。
- 代码更易维护:单次查询的逻辑集中,不需要重复编写多个类似的查询语句(比如每个优先级写一个查询)。后续如果要修改未同步的判断条件(比如加上时间范围),只需要修改一处代码即可。
- 数据一致性有保障:如果在多次查询的间隙,有其他操作(比如同步服务更新了
IsSynced字段)修改了Tasks表,多次查询的结果可能出现数据不一致的情况;而单次查询能拿到数据库的瞬时快照,避免这类问题。
代码示例
- 首先在Drift DAO中定义获取所有未同步任务的查询:
// 假设你的Tasks表对应的Drift实体是Task,DAO类是TasksDao Future<List<Task>> fetchAllUnsyncedTasks() => (select(tasks) ..where((t) => t.isSynced.equals(false))) .get();
- 在业务代码中按优先级拆分(可以借助
collection包的groupBy方法简化操作):
import 'package:collection/collection.dart'; // 获取所有未同步任务 final allUnsyncedTasks = await db.tasksDao.fetchAllUnsyncedTasks(); // 按优先级分组 final tasksGroupedByPriority = groupBy(allUnsyncedTasks, (Task task) => task.priority); // 按需获取对应优先级的任务列表 final highPriorityTasks = tasksGroupedByPriority[1] ?? []; // 假设1是高优先级 final mediumPriorityTasks = tasksGroupedByPriority[2] ?? [];
例外情况
如果某一优先级的未同步任务量极大(比如上万条),且你只需要处理这一类任务,单独查询该优先级的任务可以减少内存占用。但这种场景在常规的任务管理App中非常少见,大部分情况下单次查询+内存拆分是更优的选择。
内容的提问来源于stack exchange,提问作者Santhosh L
相关产品推荐
相关产品推荐

