如何在颤动沼泽中为双值创建列

Spi*_*iDs 0 sqlite flutter flutter-moor

我将 flutter_moor 用于 SQLite 数据库。我有一个问题,我需要一个带有两位小数的双倍货币金额列。

我发现有一个 RealColumn,但不知道如何正确实现它。

/// A column that stores floating point numeric values./// 

    abstract class RealColumn extends Column<double, RealType> {}
Run Code Online (Sandbox Code Playgroud)

这是表的样子:

class MyClass extends Table {

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

    TextColumn get title => text().withLength(min: 1, max: 35)();

    TextColumn get description => text().withLength(min: 0, max: 50)();

    TextColumn get categorie => text().withLength(min: 1, max: 35)();

    RealColumn get amount => double()();

    DateTimeColumn get date => dateTime()();
}
Run Code Online (Sandbox Code Playgroud)

RealColumn 上的 double() 不起作用。我认为它与 int 或 text 相同。我没有在文档和网络中找到解决方案。
我的问题是,让金额列工作的正确方法是什么?

非常感谢您的帮助。


----编辑:----
完整文件:

import 'dart:core';

import 'package:moor/moor.dart';
import 'package:moor_flutter/moor_flutter.dart';

part 'moor_database.g.dart';

class Transactions extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get title => text().withLength(min: 1, max: 35)();
  TextColumn get description => text().withLength(min: 0, max: 50)();
  TextColumn get categorie => text().withLength(min: 1, max: 35)();
  RealColumn get amount => double()();     //!!!<---This is line with the error///
  DateTimeColumn get date => dateTime()();
}

@UseMoor(tables: [Transactions])
class AppDatabase extends _$AppDatabase {
  AppDatabase()
      : super((FlutterQueryExecutor.inDatabaseFolder(
          path: 'db.sqlite',
          logStatements: true,
        )));

  @override
  int get schemaVersion => 1;

  Future<List<Transaction>> getAllTasks() => select(transactions).get();
  Stream<List<Transaction>> watchAllTasks() => select(transactions).watch();
  Future insertTask(Transaction transaction) => into(transactions).insert(transaction);
  Future updateTask(Transaction transaction) => update(transactions).replace(transaction);
  Future deleteTask(Transaction transaction) => delete(transactions).delete(transaction);
}
Run Code Online (Sandbox Code Playgroud)

double()() 有下划线

错误代码如下(我使用的是 VSCode):

抽象类不能被实例化。尝试创建一个子类型的实例。

该表达式不会计算为函数,因此无法调用它。

'$TransactionsTable.amount' ('GeneratedIntColumn Function()') 不是 'Transactions.amount' ('RealColumn Function()') 的有效覆盖。


例如, IntColumn 的 flutter_moor 文档是:

/// 存储 int 值的列。抽象类 IntColumn 扩展了 Column {}

这是有效的:

IntColumn get amount => integer()();
Run Code Online (Sandbox Code Playgroud)

我不明白错误以及为什么 double()() 不起作用。

我希望这有帮助:)

Sam*_*mad 7

您应该像这样使用 real() 而不是 double() :

RealColumn get amount => real()(); 
Run Code Online (Sandbox Code Playgroud)