Я пытаюсь понять, как в транзакции использовать асинхронные методы расширения 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 и синхронные расширения, и получение оттуда соединения синхронизации, не помогло.