我有一个SQFlite
Database
的单例实例的吸气剂,如下所示:
static Database _db;
static Future<Database> get db async {
if( _db == null )
_db = await openOrCreateDatabase();
return _db;
}
现在,我想对db
进行查询:
final List<Map<String, dynamic>> rows = await (await db).query(
'mytable',
where: 'id<?',
whereArgs: [10]
);
我发现await (await db)
很丑-是否有更好的方法将两个await
串行“链接”在一起?
答案 0 :(得分:0)
由于两个操作都返回一个Future,因此没有其他方法可以等待这两个操作。要一次等待多个期货,您需要将其添加到期货列表中,然后使用Future.wait,但在这种情况下通常更难看且无用。
var futures = <Future>[];
futures.add(operationThatReturnAFuture());
futures.add(operationThatReturnAFuture());
await Future.wait(futures);
Dart在等待之间不支持这种链接,但是我知道在这种情况下,这看起来很奇怪。
也许如果将变量行更改为方法,代码看起来会更简洁。
例如:
getUser(int id) async {
final db = await database;
var res = await db.query("User", where: "id = ?", whereArgs: [id]);
return res.isNotEmpty ? User.fromMap(res.first) : Null ;
}
答案 1 :(得分:0)
一种替代方法是使用旧语法then()
:
Future getDb() => db;
Future makeQuery(db) => db.query(
'mytable',
where: 'id<?',
whereArgs: [10]
);
void doSomethingWithQuery(query){}
getDb().then(makeQuery).then(doSomethingWithQuery);
代码自然以这种方式读取:“获取数据库,然后进行查询,然后执行其他操作”。我认为async
和getDb()
不需要makeQuery(db)
关键字,但我可能是错的。
请注意,可以使用了解空值的get db
运算符简化??=
方法:
static Future<Database> get db async => _db ??= await openOrCreateDatabase();