You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中sqflite与Django联动及用户专属提醒实现咨询

解决Flutter sqflite多用户提醒隔离及与Django联动方案

一、先搞定本地sqflite的用户隔离,让提醒只属于创建者

要让不同用户看不到彼此的提醒,核心就是给本地的提醒表加个user_id关联字段,把每个提醒和创建它的用户绑定:

  1. 修改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
    );
    
  2. 登录后存好当前用户ID
    用户用Django的账号密码登录成功后,把后端返回的user_id存在本地(比如用SharedPreferences),之后所有操作都基于这个ID。
  3. 操作提醒时带上用户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();
      }
      
  4. 登出时清理本地状态
    用户登出后,清空本地存储的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:25:24