如何使用 moor_flutter 包计算 sqlite db table 中的记录?

How to count records in sqlite db table using moor_flutter package?

如何计算 table 中的所有行并使用 moor_flutter 包获取结果行数?

我看过 moor_flutter 官方文档 here 但我找不到我要找的东西。

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

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

编辑

现在,moor 支持计数表达式,请参阅this link or

这个答案不再是,因为明显的性能问题。


moor_flutter中没有这样的语句(只有selectintoupdatedelete)。

这应该有效:

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

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

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

或者您可以尝试 write custom SQL queries

最终人数 = persons.id.count();

It is supported in moor 2.4

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

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

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

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

它现在记录在 the official documentation

规范的摩尔人方式似乎让我有些困惑。如果你也有同感,你可以去老学校试试:

@UseDao(
  tables: [Instruments],
  queries: {
    'instrumentsCount': 'SELECT COUNT(*) FROM instruments;'
  },
)