如何在 flutter moor 中为双值创建列
How to create a Column for double Values in flutter moor
我对 SQLite 数据库使用 flutter_moor。我有一个问题,我需要一个双精度的货币金额列,小数点后两位。
我发现有一个 RealColumn,但不知道如何正确实现它。
/// A column that stores floating point numeric values.///
abstract class RealColumn extends Column<double, RealType> {}
这是 table 的样子:
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()();
}
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);
}
double()() 有下划线
错误码如下(我用的是VSCode):
抽象 classes 无法实例化。
尝试创建一个子类型的实例。
表达式的计算结果不是函数,因此无法调用。
'$TransactionsTable.amount' ('GeneratedIntColumn Function()') 不是 'Transactions.amount' ('RealColumn Function()') 的有效覆盖。
例如,IntColumn 的 flutter_moor 文档是:
/// 存储 int 值的列。
抽象 class IntColumn 扩展列 {}
这是有效的:
IntColumn get amount => integer()();
我不明白错误以及为什么 double()() 不起作用。
希望对您有所帮助:)
你应该像这样使用 real() 而不是 double() :
RealColumn get amount => real()();
我对 SQLite 数据库使用 flutter_moor。我有一个问题,我需要一个双精度的货币金额列,小数点后两位。
我发现有一个 RealColumn,但不知道如何正确实现它。
/// A column that stores floating point numeric values.///
abstract class RealColumn extends Column<double, RealType> {}
这是 table 的样子:
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()();
}
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);
}
double()() 有下划线
错误码如下(我用的是VSCode):
抽象 classes 无法实例化。 尝试创建一个子类型的实例。
表达式的计算结果不是函数,因此无法调用。
'$TransactionsTable.amount' ('GeneratedIntColumn Function()') 不是 'Transactions.amount' ('RealColumn Function()') 的有效覆盖。
例如,IntColumn 的 flutter_moor 文档是:
/// 存储 int 值的列。 抽象 class IntColumn 扩展列 {}
这是有效的:
IntColumn get amount => integer()();
我不明白错误以及为什么 double()() 不起作用。
希望对您有所帮助:)
你应该像这样使用 real() 而不是 double() :
RealColumn get amount => real()();