Как использовать асинхронные расширения SQLITE в транзакции в Xamarin Forms PCL?

Я пытаюсь понять, как в транзакции использовать асинхронные методы расширения SQLITE, такие как InsertOrReplaceWithChildrenAsync (NuGet от TwinCoders).

При запуске в моем PCL Xamarin.Forms у меня есть:

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

В качестве примечания я мог бы дополнительно сделать следующее, но я этого не делаю, прочитав, что неразумно смешивать синхронные и асинхронные операции с базой данных:

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() { ... }
    ...
}

Может показаться, что добавление асинхронных пакетов каким-то образом блокирует синхронные расширения. Однако добавление библиотеки вспомогательных классов PCL, которая имеет только синхронный SQLite.Net и синхронные расширения, и получение оттуда соединения синхронизации, не помогло.


person BillF    schedule 21.03.2015    source источник


Ответы (1)


Гильермо Гутьеррес Дорал решил это следующим образом:

«Из-за асинхронной природы SQLite.Net внутри транзакции поддерживаются только синхронные операции. В противном случае любая неудачная операция между началом и концом транзакции может привести к откату транзакции, даже если операция не была внутри блока транзакции. . Это не ограничение SQLite-Net Extensions, а ограничение SQLite.Net. Вы по-прежнему можете получить доступ ко всем синхронным операциям SQLite-Net Extensions, например InsertOrReplaceWithChildren».

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

person BillF    schedule 14.04.2015