Flutter中如何在函数内获取SQLite联系人列表供Twilio发信使用?
实现方案
一、现有SQLite方案实现步骤
你已完成的SQLite实现中会包含统一的DatabaseHelper操作类,首先在该类中补充查询全量联系人的方法:
// 新增到DatabaseHelper类中 Future<List<Map<String, dynamic>>> getAllContacts() async { final db = await instance.database; return db.query('contacts'); // 表名替换为你实际的联系人表名 } // 如果你已经封装了联系人实体类,可以直接返回实体列表 Future<List<Contact>> getAllContactEntities() async { final db = await instance.database; final List<Map<String, dynamic>> maps = await db.query('contacts'); return List.generate(maps.length, (i) { return Contact( id: maps[i]['id'], name: maps[i]['name'], phone: maps[i]['phone'], // 字段名替换为你建表时的电话号码字段名 ); }); }
之后在Twilio函数所在的独立文件中,导入DatabaseHelper,修改发送函数如下:
import '你的实际路径/database_helper.dart'; // 替换为DatabaseHelper文件的实际路径 void sendSms(String messageBody) async { // 1. 从SQLite拉取所有联系人数据 final List<Contact> contacts = await DatabaseHelper.instance.getAllContactEntities(); // 2. 遍历批量发送 for (var contact in contacts) { // 电话号码需要符合Twilio格式要求,必须带国际区号前缀,比如中国号码需加+86 if (contact.phone.isNotEmpty) { try { await twilioFlutter.sendSMS( toNumber: contact.phone, messageBody: messageBody ); // 加延迟避免触发Twilio频率限制 await Future.delayed(const Duration(milliseconds: 500)); } catch(e) { // 可自行添加单条发送失败的日志打印/容错逻辑 print('号码${contact.phone}发送失败:$e'); } } } }
- 注意事项:
- 提前校验本地存储的电话号码格式,避免因格式问题触发Twilio接口报错
- 批量发送的间隔时长可根据Twilio的账号等级调整,避免触发限流
二、切换Firestore的可选实现方案
如果你的应用需要多端同步、云端备份联系人数据,Firestore是更简化的选型,无需维护本地数据库版本升级逻辑:
1. 前置准备
完成Firebase项目配置,在pubspec.yaml中添加cloud_firestore依赖
2. 联系人CRUD示例代码
import 'package:cloud_firestore/cloud_firestore.dart'; class ContactService { final CollectionReference contactsRef = FirebaseFirestore.instance.collection('contacts'); // 新增联系人 Future<void> addContact(String name, String phone) { return contactsRef.add({ 'name': name, 'phone': phone, 'createdAt': FieldValue.serverTimestamp(), }); } // 获取所有联系人 Future<List<Contact>> getAllContacts() async { final QuerySnapshot snapshot = await contactsRef.get(); return snapshot.docs.map((doc) { return Contact( id: doc.id, name: doc['name'], phone: doc['phone'], ); }).toList(); } // 更新联系人 Future<void> updateContact(String docId, String newName, String newPhone) { return contactsRef.doc(docId).update({ 'name': newName, 'phone': newPhone }); } // 删除联系人 Future<void> deleteContact(String docId) { return contactsRef.doc(docId).delete(); } }
3. 适配Twilio发送函数
void sendSmsWithFirestore(String messageBody) async { final List<Contact> contacts = await ContactService().getAllContacts(); for (var contact in contacts) { if (contact.phone.isNotEmpty) { try { await twilioFlutter.sendSMS( toNumber: contact.phone, messageBody: messageBody ); await Future.delayed(const Duration(milliseconds: 500)); } catch(e) { print('号码${contact.phone}发送失败:$e'); } } } }
- Firestore选型优势:
- 无需处理本地数据库升级、数据迁移逻辑
- 联系人数据云端存储,卸载重装不会丢失
- 自带权限控制能力,可灵活配置数据访问规则
- 支持多端实时同步联系人数据
内容的提问来源于stack exchange,提问作者Max Moe
相关产品推荐
相关产品推荐

