xamarin - 如何在 Xamarin Forms PCL 的事务中使用 SQLITE 异步扩展?

标签 xamarin xamarin.forms sqlite.net

我试图弄清楚如何在事务中使用 SQLITE 异步扩展方法,例如 InsertOrReplaceWithChildrenAsync(来自 TwinCoders 的 NuGet)。

在我的 Xamarin.Forms PCL 中启动时,我有:

using Xamarin.Forms;
using SQLite.Net;
using SQLite.Net.Async;
using SQLiteNetExtensions;
using SQLiteNetExtensionsAsync.Extensions;
...
...
static SQLiteAsyncConnection db;
db = DependencyService.Get<ISQLite> ().GetAsyncConnection ();

作为旁注,我还可以执行以下操作,但我没有这样做,因为我读到混契约(Contract)步和异步数据库操作是不明智的:

dbSync = DependencyService.Get<ISQLite> ().GetSyncConnection ();

我的第一个想法是:

await db.RunInTransactionAsync ( 
    ( SQLite.Net.Async.SQLiteAsyncConnection tran ) => 
        { tran.InsertAll WithChildren ( ...); ... }

但这在构建时会收到以下警告:

... RunInTransactionAsync(Action<SQLiteAsyncConnection> ... will 
cause a deadlock if .... 
Use RunInTransactionAsync(Action<SQLiteConnection>) instead.

如果我在事务中使用同步方法,则以下操作有效:

await db.RunInTransactionAsync ( ( SQLite.Net.SQLiteConnection tran ) =>
{
    var x = new X();
    tran.Insert (x);
    var y = new Y();
    tran.Insert (y);
});

但是tran只有常规的同步方法,不提供InsertOrReplaceWithChildren等任何扩展方法。

我的搜索没有找到任何有关如何访问事务中的扩展方法的信息。

如果我按上述方式获取 dbSync,则 dbSync 不提供扩展方法。也许这与问题有关。在我的配套 IOS 项目中,我有:

using Xamarin.Forms;
using SQLite.Net;
using SQLite.Net.Async;
using SQLite.Net.Platform.XamarinIOS;
...
...
public class Conn : Xyz.ISQLite
{
    ...
    public SQLite.Net.SQLiteConnection GetSyncConnection () { ... }
    public SQLiteAsyncConnection GetAsyncConnection() { ... }
    ...
}

添加异步包似乎会以某种方式阻止同步扩展。然而,添加仅具有同步 SQLite.Net 和同步扩展的 PCL 帮助器类库,并从那里获取同步连接,并没有帮助。

最佳答案

Guillermo Gutiérrez Doral 解决了这个问题,如下:

“由于SQLite.Net异步的本质,事务内部仅支持同步操作。否则,事务开始和结束之间的任何失败操作都可能使事务回滚,即使该操作不在事务内部交易区 block 。 这不是 SQLite-Net 扩展的限制,而是 SQLite.Net 的限制。您仍然可以访问所有 SQLite-Net Extensions 同步操作,例如 InsertOrReplaceWithChildren。”

https://bitbucket.org/twincoders/sqlite-net-extensions/issue/61/async-extension-methods-within-a

关于xamarin - 如何在 Xamarin Forms PCL 的事务中使用 SQLITE 异步扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178432/

相关文章:

c# - 为什么 View 模型中的单选按钮绑定(bind)被多次触发

c# - SQLite-Net 扩展中多个(相关)类类型的数组

c# - 使用数据绑定(bind),如何将包含表情符号的文本绑定(bind)到标签并使其正确显示?

c# - Xamarin - 有没有办法从 native 项目通知 Xamarin.Forms?

c# - SQLite.NET - System.NotSupportedException : Cannot compile: Parameter

c# - 如何在 Xamarin.iOS 中绘制圆角矩形?

ios - 将 iOS 静态库绑定(bind)到 Xamarin.iOS 并使用 dll

SQLite 默认值为 bool 列,未按预期工作

android - Xamarin.Forms 中的 float 操作按钮

c# - 如何在 Sqlite.Net 的 where 子句中使用 DateTime