databaseexception(外键约束失败(代码787))sql'插入或失败

发布于 2025-02-02 16:03:08 字数 2938 浏览 1 评论 0原文

我在添加新习惯并将其数据插入数据库的同时,我对外键有问题,我真的不知道为什么,因为一切似乎都正确。错误是:

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: DatabaseException(FOREIGN KEY constraint failed (code 787)) sql 'INSERT OR FAIL INTO Habits (userId, text, emoji, period, startPeriod) VALUES (?, ?, ?, ?, NULL)' args [1, habit, ☺, [1,2,3,4,5,6,7]]

在此处累积错误:

class DataService {...
  late final Database db;
    Future<void> addHabit(Habit newHabit) async {
        final newHabitId = await HabitsDb.createHabit(db, newHabit);//error accrued here
        final days = (await HabitsDb.getAllDays(db)).map((e) => Day.fromDb(e, []));
    
        for (final day in days) {
          if (newHabit.startPeriod != null &&
              newHabit.startPeriod!.compareTo(day.date) > 0) {
            continue;
          }
    
          if (newHabit.period.contains(day.date.weekday)) {
            await HabitsDb.createHabitDay(
                db, day.date.millisecondsSinceEpoch, newHabitId);
          }
        }
    
        await _reloadDaysInCache();
        _loadHabits();
      } ...}

然后:

class HabitsDb{...
  static Future<int> createHabit(Database db, Habit habit) async {
    return db.insert(HabitsTable.tableName, await habit.toDb(),
        conflictAlgorithm: ConflictAlgorithm.fail);
  }...}

模型:

    class Habit {
      late final int id;
      late final int userId;
      late String text;
      late String emoji;
      late final List<int> period;
      late final DateTime? startPeriod;
...
    Future<Map<String, dynamic>> toDb() async {
        
        print(text);
        print(userId);
        return {
          //HabitsTable.id: id,
          HabitsTable.userId: userId,
          HabitsTable.text: text,
          HabitsTable.emoji: emoji,
          HabitsTable.period: jsonEncode(period),
          HabitsTable.startPeriod: startPeriod?.millisecondsSinceEpoch
        };
      }...}

创建表:

class HabitsTable {
  static const String tableName = 'Habits';

  static const String id = 'id';
  static const String userId = 'userId';
  static const String text = 'text';
  static const String emoji = 'emoji';
  static const String period = 'period';
  static const String startPeriod = 'startPeriod';

  static const String createQuery = '''
    CREATE TABLE IF NOT EXISTS $tableName (
      $id INTEGER PRIMARY KEY AUTOINCREMENT,
      $userId INTEGER NOT NULL,
      $text TEXT NOT NULL,
      $emoji TEXT NOT NULL,
      $period TEXT NOT NULL,
      $startPeriod INTEGER,
      FOREIGN KEY($userId) REFERENCES ${UsersTable.tableName}(id));''';
}

如果需要更多代码,则可以检查 https:/https:/ /Github.com/sarasoltan/habit_tracker 如果您知道如何解决此错误,请帮助您。

I'm having problem with foreign key while adding a new habit and inserting it's data in db and I don't really know why, because everything seems right. the error is:

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: DatabaseException(FOREIGN KEY constraint failed (code 787)) sql 'INSERT OR FAIL INTO Habits (userId, text, emoji, period, startPeriod) VALUES (?, ?, ?, ?, NULL)' args [1, habit, ☺, [1,2,3,4,5,6,7]]

error accrued here:

class DataService {...
  late final Database db;
    Future<void> addHabit(Habit newHabit) async {
        final newHabitId = await HabitsDb.createHabit(db, newHabit);//error accrued here
        final days = (await HabitsDb.getAllDays(db)).map((e) => Day.fromDb(e, []));
    
        for (final day in days) {
          if (newHabit.startPeriod != null &&
              newHabit.startPeriod!.compareTo(day.date) > 0) {
            continue;
          }
    
          if (newHabit.period.contains(day.date.weekday)) {
            await HabitsDb.createHabitDay(
                db, day.date.millisecondsSinceEpoch, newHabitId);
          }
        }
    
        await _reloadDaysInCache();
        _loadHabits();
      } ...}

then:

class HabitsDb{...
  static Future<int> createHabit(Database db, Habit habit) async {
    return db.insert(HabitsTable.tableName, await habit.toDb(),
        conflictAlgorithm: ConflictAlgorithm.fail);
  }...}

model:

    class Habit {
      late final int id;
      late final int userId;
      late String text;
      late String emoji;
      late final List<int> period;
      late final DateTime? startPeriod;
...
    Future<Map<String, dynamic>> toDb() async {
        
        print(text);
        print(userId);
        return {
          //HabitsTable.id: id,
          HabitsTable.userId: userId,
          HabitsTable.text: text,
          HabitsTable.emoji: emoji,
          HabitsTable.period: jsonEncode(period),
          HabitsTable.startPeriod: startPeriod?.millisecondsSinceEpoch
        };
      }...}

creating table:

class HabitsTable {
  static const String tableName = 'Habits';

  static const String id = 'id';
  static const String userId = 'userId';
  static const String text = 'text';
  static const String emoji = 'emoji';
  static const String period = 'period';
  static const String startPeriod = 'startPeriod';

  static const String createQuery = '''
    CREATE TABLE IF NOT EXISTS $tableName (
      $id INTEGER PRIMARY KEY AUTOINCREMENT,
      $userId INTEGER NOT NULL,
      $text TEXT NOT NULL,
      $emoji TEXT NOT NULL,
      $period TEXT NOT NULL,
      $startPeriod INTEGER,
      FOREIGN KEY($userId) REFERENCES ${UsersTable.tableName}(id));''';
}

if more code is needed you can check https://github.com/sarasoltan/habit_tracker
plz help if you know how to solve this error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文