gpt4 book ai didi

sqlite - 如何将 dart-sqlite 代码从同步样式更改为异步?

转载 作者:行者123 更新时间:2023-12-03 04:31:25 24 4
gpt4 key购买 nike

我正在尝试将 Dart 与 sqlite 一起使用,这个项目 dart-sqlite .

但是我发现了一个问题:它提供的API是同步风格的。代码将如下所示:

// Iterating over a result set
var count = c.execute("SELECT * FROM posts LIMIT 10", callback: (row) {
print("${row.title}: ${row.body}");
});
print("Showing ${count} posts.");

有了这样的代码,我无法使用 Dart 的 future 支持,并且代码会在 sql 操作处阻塞。

我想知道如何将代码更改为异步样式?你可以看到它定义了一些 native这里的功能: https://github.com/sam-mccall/dart-sqlite/blob/master/lib/sqlite.dart#L238
_prepare(db, query, statementObject) native 'PrepareStatement';
_reset(statement) native 'Reset';
_bind(statement, params) native 'Bind';
_column_info(statement) native 'ColumnInfo';
_step(statement) native 'Step';
_closeStatement(statement) native 'CloseStatement';
_new(path) native 'New';
_close(handle) native 'Close';
_version() native 'Version';

native 函数在此处映射到一些 c++ 函数: https://github.com/sam-mccall/dart-sqlite/blob/master/src/dart_sqlite.cc

是否可以更改为异步?如果可能,我该怎么办?

如果不可能,我必须重写它,我是否必须重写所有:
  • Dart 文件
  • c++ 包装文件
  • 实际的sqlite驱动


  • 更新:

    感谢@GregLowe 的评论,Dart 的 Completer可以将回调样式转换为future样式,这可以让我使用Dart的 doSomething().then(...)而不是传递回调函数。

    但是在阅读了 dart-sqlite 的源码后,我意识到,在 dart-sqlite 的实现中, callback不是基于事件的:
    int execute([params = const [], bool callback(Row)]) {
    _checkOpen();
    _reset(_statement);
    if (params.length > 0) _bind(_statement, params);
    var result;
    int count = 0;
    var info = null;
    while ((result = _step(_statement)) is! int) {
    count++;
    if (info == null) info = new _ResultInfo(_column_info(_statement));
    if (callback != null && callback(new Row._internal(count - 1, info, result)) == true) {
    result = count;
    break;
    }
    }
    // If update affected no rows, count == result == 0
    return (count == 0) ? result : count;
    }

    即使我使用 Completer ,它不会提高性能。我想我可能必须重写 c++ 代码以使其首先基于事件。

    最佳答案

    您应该能够在不接触 C++ 的情况下编写包装器。看看如何在 dart:async 中使用 Completer 类。基本上你需要创建一个 Completer,立即返回 Completer.future,然后从现有回调中调用 Completer.complete(row)。

    回复:更新。你见过这个article ,特别是关于异步扩展的一点?即,如果 C++ API 是同步的,您可以在单独的线程中运行它,并使用消息传递与其通信。这可能是一种方法。

    关于sqlite - 如何将 dart-sqlite 代码从同步样式更改为异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631208/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com