Flutter中sqflite与Django联动及用户专属提醒实现咨询
解决Flutter sqflite多用户提醒隔离及与Django联动方案
一、先搞定本地sqflite的用户隔离,让提醒只属于创建者
要让不同用户看不到彼此的提醒,核心就是给本地的提醒表加个user_id关联字段,把每个提醒和创建它的用户绑定:
- 修改sqflite表结构
建表的时候多加个user_id字段,类型和Django那边的用户ID保持一致(比如字符串或整数):CREATE TABLE reminders ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, remind_time DATETIME, user_id TEXT NOT NULL -- 用来关联所属用户的ID ); - 登录后存好当前用户ID
用户用Django的账号密码登录成功后,把后端返回的user_id存在本地(比如用SharedPreferences),之后所有操作都基于这个ID。 - 操作提醒时带上用户ID
- 创建提醒:插入数据时必须把当前用户的
user_id一起存进去; - 查询提醒:必须加
user_id的过滤条件,只查当前用户的记录,示例代码:Future<List<Reminder>> getMyReminders() async { final db = await _database; final prefs = await SharedPreferences.getInstance(); final currentUserId = prefs.getString('current_user_id'); // 只拉当前用户的提醒,彻底隔离其他用户数据 final results = await db.query( 'reminders', where: 'user_id = ?', whereArgs: [currentUserId], ); return results.map((map) => Reminder.fromMap(map)).toList(); }
- 创建提醒:插入数据时必须把当前用户的
- 登出时清理本地状态
用户登出后,清空本地存储的user_id,避免下次登录其他用户时读到旧数据。
二、sqflite和Django联动的两种方案
方案1:本地sqflite做缓存,后端Django存主数据
这种方式适合需要离线使用提醒功能的场景:
- 登录后,先调用Django的API拉取当前用户的所有提醒,同步到本地sqflite;
- 创建/修改/删除提醒时,先更新本地数据库,再调用Django的API同步到后端;
- 可以在网络恢复、用户登录时做双向同步,确保本地和后端数据一致。比如拉取远程数据的示例:
Future<void> syncRemindersWithBackend() async { final prefs = await SharedPreferences.getInstance(); final authToken = prefs.getString('auth_token'); final currentUserId = prefs.getString('current_user_id'); // 调用Django的提醒列表接口 final response = await http.get( Uri.parse('https://your-django-domain/api/reminders/'), headers: {'Authorization': 'Bearer $authToken'}, ); if (response.statusCode == 200) { final remoteReminders = jsonDecode(response.body) as List; final db = await _database; // 先清空本地当前用户的旧数据,再插入最新的远程数据(也可以做增量同步优化) await db.delete('reminders', where: 'user_id = ?', whereArgs: [currentUserId]); for (var r in remoteReminders) { await db.insert('reminders', { 'title': r['title'], 'content': r['content'], 'remind_time': r['remind_time'], 'user_id': currentUserId, }); } } }
方案2:直接用Django作为唯一存储,本地不存持久化数据
如果不需要离线使用提醒,完全可以把sqflite去掉,所有操作直接走Django的API:
- 用Django REST Framework搭一套提醒的CRUD接口,接口里通过JWT或session认证自动识别当前用户,返回仅属于该用户的提醒;
- Flutter端用
http或dio调用这些接口,展示和操作提醒。这种方式不用处理本地数据的隔离问题,因为后端会自动过滤掉不属于当前用户的数据。
内容的提问来源于stack exchange,提问作者Mr.Robot
相关产品推荐
相关产品推荐

