如何使用moor_flutter包计算表中的所有行并获得行数?
我在这里看到了 moor_flutter 官方文档,但我找不到我要找的东西。
我希望在使用 moor_flutter 包时,根据 crud 函数的相似性,它会像下面的函数,但它也不起作用。
Future<int<Person>> countPersons() => count(persons).get();
如何使用moor_flutter包计算表中的所有行并获得行数?
我在这里看到了 moor_flutter 官方文档,但我找不到我要找的东西。
我希望在使用 moor_flutter 包时,根据 crud 函数的相似性,它会像下面的函数,但它也不起作用。
Future<int<Person>> countPersons() => count(persons).get();
我想出了一种查找表格行数的方法。这是带有基本注释的完整解决方案,
//Create expression of count
var countExp = persons.id.count();
//Moor creates query from Expression so, they don't have value unless you execute it as query.
//Following query will execute experssion on Table.
final query = selectOnly(persons)..addColumns([countExp]);
var result = await query.map((row) => row.read(countExp)).getSingle();
请注意,我使用selectOnly
了而不是select
因为我对除 Count 之外的任何列都不感兴趣。
编辑
由于明显的性能问题,这个答案不再可行。
moor_flutter
(只有select
, into
,update
和delete
)中没有这样的陈述。
这应该工作:
Future<int> countPersons() async {
return (await select(persons).get()).length;
}
或(完全相同,但只有一行)
Future<int> countPersons() async => (await select(persons).get()).length;
或者您可以尝试编写自定义 SQL 查询。
countAll
如果您需要计数的过滤条件,那么您可以使用命名参数调用顶级函数,filter
如下所示。
var count = countAll(filter: persons.id.isSmallerThanValue(100));
var res = await (selectOnly(persons)..addColumns([count]))
.map((row) => row.read(count))
.getSingle();
它现在记录在官方文档中
规范的 Moor 方式对我来说似乎有点令人困惑。如果你有同样的感觉,你可能会去老学校尝试:
@UseDao(
tables: [Instruments],
queries: {
'instrumentsCount': 'SELECT COUNT(*) FROM instruments;'
},
)
最终 numberOfPersons = person.id.count();