Dart版ObjectBox的ToMany关联能否实现按需逐个加载?
ObjectBox ToMany关联如何实现按需逐个加载?
根据ObjectBox文档说明:to-many relations are resolved lazily on first access, and then cached in the source entity inside the ToMany object,即ToMany关联会在首次访问时一次性加载所有关联数据并缓存。但在实际场景中,当实体A关联大量(数千个)实体B时,一次性加载会拖慢应用,需要实现关联数据的按需逐个加载。
通过包含Account和Transaction的Flutter测试应用验证,首次访问account.transactions时,日志显示所有关联交易被一次性加载,不符合按需加载的预期。
解决方案
由于ObjectBox自带的ToMany机制本身就是全量加载后缓存,要实现按需加载,需要绕过自带的ToMany,直接使用查询API手动控制加载逻辑:
1. 使用游标(Cursor)逐个读取关联数据
通过查询构建游标,逐个遍历获取关联实体,避免一次性加载全部数据:
_readAccounts() async { final accounts = accountBox.getAll(); for (var account in accounts) { print('Account ID: ${account.id}'); await Future.delayed(const Duration(seconds: 1)); // 构建查询:筛选当前账户下的交易 final query = transactionBox.query(Transaction_.account.equals(account.id)).build(); // 使用游标逐个读取数据 final cursor = query.findCursor(); try { while (cursor.moveNext()) { final transaction = cursor.current; print('Transaction ID: ${transaction.id}'); await Future.delayed(const Duration(seconds: 1)); } } finally { // 务必关闭游标和查询,避免资源泄漏 cursor.close(); query.close(); } } }
2. 分页加载关联数据
如果是UI展示场景,适合分页加载,每次加载固定数量的交易,滚动到底部时再加载下一批:
// 分页加载示例,每次加载20条 _loadTransactionsForAccount(Account account, int offset) async { final query = transactionBox.query(Transaction_.account.equals(account.id)) .offset(offset) .limit(20) .build(); final transactions = query.find(); query.close(); return transactions; } // 使用示例 _readAccounts() async { final accounts = accountBox.getAll(); for (var account in accounts) { print('Account ID: ${account.id}'); int offset = 0; while (true) { final transactions = await _loadTransactionsForAccount(account, offset); if (transactions.isEmpty) break; for (var transaction in transactions) { print('Transaction ID: ${transaction.id}'); await Future.delayed(const Duration(seconds: 1)); } offset += 20; await Future.delayed(const Duration(milliseconds: 500)); } } }
说明
- ObjectBox的ToMany设计目标是简化关联操作,而非处理超大量数据的按需加载,因此需要手动通过查询API实现自定义加载逻辑。
- 使用游标或分页查询时,注意及时关闭查询和游标,避免数据库连接等资源泄漏。
内容的提问来源于stack exchange,提问作者Biotic55
相关产品推荐
相关产品推荐

