【发布时间】:2021-04-19 10:35:34
【问题描述】:
我正在开发一个应用程序,我正在使用 sqflite 插件实现 SQL 数据库。在这个应用程序中,用户可以通过填写下面的表格来创建交易 然后用户可以验证他们的交易,他们还可以选择编辑交易,以防他们犯了错误 现在我想添加一个功能,通过它他们可以在下面的屏幕上获得他们在特定月份完成的费用总和 它显示为空,但它应该显示费用的总和
我的查询代码是
Future getDataJan() async{
final db = await database;
sumJan=await db.rawQuery(
'SELECT SUM(AMOUNT) FROM EXPENSES WHERE DATE(DATETIME) >= ? AND DATE(DATETIME) <= ?',
[2021-01-01, 2021-01-31] ).then(Sqflite.firstIntValue);
print(sumJan);
finalJan=sumJan.toString();
}
数据库创建:
Future<Database> createDatabase() async {
String dbPath = await getDatabasesPath();
return await openDatabase(
join(dbPath, 'expenseDB.db'),
version: 1,
onCreate: (Database database, int version) async {
print("Creating expense table");
await database.execute(
"CREATE TABLE $TABLE_EXPENSES ("
"$COLUMN_ID INTEGER PRIMARY KEY,"
"$COLUMN_NAME TEXT,"
"$COLUMN_AMOUNT INTEGER,"
"$COLUMN_UNNECESSARYEXPENSES INTEGER,"
"$COLUMN_CATEGORY TEXT,"
"$COLUMN_DATETIME TEXT"
")",
);
},
);
}
映射数据库(我认为它不工作,因为映射时字符串):
Map<String, dynamic> toMap() {
var map = <String, dynamic>{
DatabaseProvider.COLUMN_NAME: name,
DatabaseProvider.COLUMN_AMOUNT: amount,
DatabaseProvider.COLUMN_UNNECESSARYEXPENSES: isUnnecessaryExpenses ? 1 : 0,
DatabaseProvider.COLUMN_CATEGORY: category,
DatabaseProvider.COLUMN_DATETIME: pickedDate,
};
if (id != null) {
map[DatabaseProvider.COLUMN_ID] = id;
}
return map;
}
编辑: 这是我创建一个小部件来调用日期选择的代码:
Widget DatePicker() {
showDatePicker(context: context, initialDate: DateTime.now(), firstDate: DateTime.parse("2020-01-01 00:00:01Z"), lastDate: DateTime.now()
).then((value){
if (value == null){
return;
}
_dateTime = value;
////saving in string
pickedDate = DateFormat('yyyy-MM-dd').format(_dateTime);
});
}
根据有问题的家伙的建议给出的错误:
lib/db/database_provider.dart:111:59: Error: Expected ',' before this.
'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m' , date(datetime)) == 01').then(Sqflite.firstIntValue);
^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/db/database_provider.dart:111:58: Error: The getter 'm' isn't defined for the class 'DatabaseProvider'.
- 'DatabaseProvider' is from 'package:finance_manager/db /database_provider.dart' ('lib/db/database_provider.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m' , date(datetime)) == 01').then(Sqflite.firstIntValue);
^
lib/db/database_provider.dart:111:57: Error: The operator '%' isn't defined for the class 'String'.
Try correcting the operator to an existing operator, or defining a '%' operator.
'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m' , date(datetime)) == 01').then(Sqflite.firstIntValue);
^
lib/db/database_provider.dart:111:59: Error: The argument type 'String' can't be assigned to the parameter type 'List<dynamic>'.
- 'List' is from 'dart:core'.
'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m' , date(datetime)) == 01').then(Sqflite.firstIntValue);
更新
我在 android studio 中使用数据库检查器打开了数据库,并尝试在其中运行以下查询:
SELECT SUM(AMOUNT) FROM EXPENSES
SELECT SUM(AMOUNT) FROM EXPENSES WHERE DATE(DATETIME) >= 2021-01-01 and DATE(DATETIME) <= 2021-01-31
上面的查询工作得很好,并返回列金额的总和,但是一旦我运行第二个查询,它再次给我 null,我想我把日期保存错了方式。
请帮忙。
感谢您的回复
【问题讨论】:
-
您能说明如何将 dateTime 转换为字符串以将其存储在 DB 中吗?
-
您好,感谢您的回复,我已经添加了代码,请再次检查。
-
尝试执行这个
SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m' , date(datetime)) == 01 -
我是这样实现的:Future getDataJan() async{ final db = await database; sumJan=await db.rawQuery('SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m' , date(datetime)) == 01').then(Sqflite.firstIntValue);打印(总和); finalJan=sumJan.toString(); }
-
我已经发布了有问题的错误信息
标签: sql flutter android-sqlite android-database sqflite