我试图弄清楚如何在事务中使用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 ();
作为旁注,我还可以执行以下操作,但我不这样做,因为已经读过混合同步和异步数据库操作是不明智的:
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助手类库,并从那里获取同步连接,没有用。
答案 0 :(得分:2)
GuillermoGutiérrezDoral解决了以下问题:
“由于SQLite.Net async的性质,事务中只支持同步操作。否则,事务开始和结束之间的任何失败操作都可能使事务回滚,即使操作不在内部交易块。 这不是SQLite-Net Extensions限制,而是SQLite.Net限制。您仍然可以访问所有SQLite-Net Extensions同步操作,例如InsertOrReplaceWithChildren。“
https://bitbucket.org/twincoders/sqlite-net-extensions/issue/61/async-extension-methods-within-a