Flutter Moor:moor 没有意识到 `id` 列是主键,我不应该告诉它它应该具有什么样的值?

时间:2021-06-13 14:59:50

标签: flutter dart

我使用了这个例子:https://resocoder.com/2019/06/26/moor-room-for-flutter-tables-queries-fluent-sqlite-database/#t-1623343521341

这是获取数据并插入数据库的方式:

onSubmitted: (inputName) {
          final database = Provider.of<AppDatabase>(context);
          final task = Task(
            name: inputName,
            dueDate: newTaskDate,
          );
          database.insertTask(task);
          resetValuesAfterSubmit();
        },

但是如果我运行它,它会说:

E/flutter ( 6598): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: InvalidDataException: Sorry, Task(id: null, name: aaa, dueDate: null, completed: null) cannot be used for that because: 
E/flutter ( 6598): • id: This column is not nullable and doesn't have a default value. Null fields thus can't be inserted.
E/flutter ( 6598): • completed: This column is not nullable and doesn't have a default value. Null fields thus can't be inserted.
E/flutter ( 6598): 
E/flutter ( 6598): #0      VerificationContext.throwIfInvalid (package:moor/src/runtime/data_verification.dart:74:5)
E/flutter ( 6598): #1      InsertStatement._validateIntegrity (package:moor/src/runtime/query_builder/statements/insert.dart:210:51)
E/flutter ( 6598): #2      InsertStatement.createContext (package:moor/src/runtime/query_builder/statements/insert.dart:117:5)
E/flutter ( 6598): #3      InsertStatement.insert (package:moor/src/runtime/query_builder/statements/insert.dart:66:17)
E/flutter ( 6598): #4      AppDatabase.insertTask (package:moortest/data/moor_database.dart:50:47)
E/flutter ( 6598): #5      _NewTaskInputState._buildTextField.<anonymous closure> (package:moortest/ui/new_task_input_widget.dart:52:20)
E/flutter ( 6598): #6      EditableTextState._finalizeEditing (package:flutter/src/widgets/editable_text.dart:1921:27)
E/flutter ( 6598): #7      EditableTextState.performAction (package:flutter/src/widgets/editable_text.dart:1781:9)
E/flutter ( 6598): #8      TextInput._handleTextInputInvocation (package:flutter/src/services/text_input.dart:1354:37)
E/flutter ( 6598): #9      MethodChannel._handleAsMethodCall (package:flutter/src/services/platform_channel.dart:435:55)
E/flutter ( 6598): #10     MethodChannel.setMethodCallHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:382:34)
E/flutter ( 6598): #11     _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:284:33)
E/flutter ( 6598): #12     _invoke3.<anonymous closure> (dart:ui/hooks.dart:223:15)
E/flutter ( 6598): #13     _rootRun (dart:async/zone.dart:1354:13)
E/flutter ( 6598): #14     _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter ( 6598): #15     _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter ( 6598): #16     _invoke3 (dart:ui/hooks.dart:222:10)
E/flutter ( 6598): #17     PlatformDispatcher._dispatchPlatformMessage (dart:ui/platform_dispatcher.dart:520:7)
E/flutter ( 6598): #18     _dispatchPlatformMessage (dart:ui/hooks.dart:90:31)

这有什么意义,因为在视频中它工作正常......还完成了应该有一个默认值:

BoolColumn get completed => boolean().withDefault(Constant(false))();

而 id 是主键:

IntColumn get id => integer().autoIncrement()();

就像我可以添加 completed 这样的默认值:

onSubmitted: (inputName) {
          final database = Provider.of<AppDatabase>(context);
          final task = Task(
            name: inputName,
            dueDate: newTaskDate,
            completed: false,
          );
          database.insertTask(task);
          resetValuesAfterSubmit();
        },

但它仍然抛出异常。如果我添加 id 一个值,那么它会使用该 ID 保存必须计算的对象,因为我总是需要检查哪个是数据库中的最高 ID 完全杀死了 autoincrement() 部分数据库...

知道有什么问题吗?

0 个答案:

没有答案
相关问题