Flutter中如何将交易数组存储到Firebase的子集合?
解决方案:将分类与交易数据分别存入Firebase Firestore集合与子集合
要实现你的需求,需要分两步处理:先将分类信息写入父集合TransactionCategory,再把对应分类下的交易数据写入该分类文档的子集合Transactions。以下是完整的实现代码:
Button( title: 'save Categories', onPressed: () async { final _db = FirebaseFirestore.instance; // 遍历所有分类 for (var category in transactionCategoryList) { // 1. 写入父集合文档:存储分类id和name await _db.collection('TransactionCategory').doc(category.id).set({ 'id': category.id, 'name': category.name, // 不包含transactions字段,因为要存在子集合 }); // 2. 遍历当前分类下的交易,写入子集合Transactions for (var transaction in category.transactions) { await _db .collection('TransactionCategory') .doc(category.id) .collection('Transactions') .doc(transaction.id) .set({ 'id': transaction.id, 'title': transaction.title, 'amount': transaction.amount, }); } } // 可选:提示保存完成 print('所有数据已成功存入Firestore'); }, ),
关键说明:
- 父集合
TransactionCategory中的每个文档以分类的id作为文档ID,确保数据唯一性 - 子集合
Transactions隶属于对应分类的文档下,每个交易文档以交易的id作为文档ID - 使用
await确保每个操作完成后再执行下一步,避免数据写入顺序混乱
如果你的Transaction和TransactionCategory模型类有toJson()方法,可以简化代码,比如:
// 写入分类时用: await _db.collection('TransactionCategory').doc(category.id).set(category.toJson()); // 注意toJson()方法不要包含transactions字段 // 写入交易时用: await _db .collection('TransactionCategory') .doc(category.id) .collection('Transactions') .doc(transaction.id) .set(transaction.toJson());
内容的提问来源于stack exchange,提问作者user22362195
相关产品推荐
相关产品推荐

