8

如何使用moor_flutter包计算表中的所有行并获得行数?

我在这里看到了 moor_flutter 官方文档,但我找不到我要找的东西。

我希望在使用 moor_flutter 包时,根据 crud 函数的相似性,它会像下面的函数,但它也不起作用。

Future<int<Person>> countPersons() => count(persons).get();
4

5 回答 5

7

我想出了一种查找表格行数的方法。这是带有基本注释的完整解决方案,

//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 之外的任何列都不感兴趣。

于 2020-09-29T11:20:23.327 回答
3

编辑

现在,moor 支持计数表达式,请参阅此链接此答案

由于明显的性能问题,这个答案不再可行。


moor_flutter(只有select, into,updatedelete)中没有这样的陈述。

这应该工作:

Future<int> countPersons() async {
    return (await select(persons).get()).length;
}

或(完全相同,但只有一行)

Future<int> countPersons() async => (await select(persons).get()).length;

或者您可以尝试编写自定义 SQL 查询

于 2020-01-17T12:44:22.847 回答
3

countAll如果您需要计数的过滤条件,那么您可以使用命名参数调用顶级函数,filter如下所示。

var count = countAll(filter: persons.id.isSmallerThanValue(100));
var res = await (selectOnly(persons)..addColumns([count]))
    .map((row) => row.read(count))
    .getSingle();

它现在记录在官方文档中

于 2021-02-23T17:51:11.640 回答
1

规范的 Moor 方式对我来说似乎有点令人困惑。如果你有同样的感觉,你可能会去老学校尝试:

@UseDao(
  tables: [Instruments],
  queries: {
    'instrumentsCount': 'SELECT COUNT(*) FROM instruments;'
  },
)
于 2021-04-03T22:52:56.870 回答
-1

最终 numberOfPersons = person.id.count();

在 moor 2.4 中支持

于 2020-06-26T15:09:36.103 回答