Usare SQLite in modo asincrono
Se si eseguono query su un database in modo sincrono, si possono verificare problemi di prestazioni e di blocco delle app. SQLite-net ha un'API asincrona che è possibile usare per mantenere reattiva l'applicazione.
In questa unità viene illustrato l'uso dell'API asincrona di SQLite-net per garantire che l'applicazione rimanga altamente reattiva.
Comprendere le query asincrone
Fino a questo punto, tutte le operazioni del database nel thread di UI sono state eseguite. Tuttavia, per compilare un'applicazione per dispositivi mobili che sia molto reattiva, le operazioni devono essere eseguite in modo leggermente diverso. Se si eseguono operazioni di database nel thread dell'interfaccia utente, è possibile che l'interfaccia utente si blocchi se il completamento dell'operazione richiede molto tempo.
Per risolvere questo problema, SQLite-net include un'API asincrona tramite la classe SQLiteAsyncConnection
. Ad esempio, per creare una tabella in modo asincrono, è possibile usare il metodo CreateTableAsync
:
var conn = new SQLiteAsyncConnection(dbPath);
await conn.CreateTableAsync<User>();
Eseguire operazioni asincrone con SQLite-net
La classe SQLiteAsyncConnection
espone operazioni simili come la controparte sincrona. Tuttavia, le operazioni sono tutte basate su attività per l'utilizzo in background.
Le operazioni asincrone comuni disponibili sono:
CreateTableAsync
: Crea una tabella basata sulla classe indicataDropTableAsync
: Elimina la tabella correlata alla classe indicataGetAsync
: ottiene il record nella tabella correlata alla classe indicata e associa la chiave primaria passata nel costruttoreInsertAsync
: inserisce un nuovo record usando l'elemento passato nel costruttoreUpdateAsync
: aggiorna un record esistente usando l'elemento passato nel costruttoreDeleteAsync
: elimina il record nella tabella mappata alla classe indicata e associa la chiave primaria passata nel costruttoreQueryAsync
: Esegue una query SQL diretta e restituisce un oggettoExecuteAsync
: Esegue una query SQL diretta e restituisce il numero di righe interessateExecuteScalarAsync
: Esegue una query SQL diretta e restituisce il singolo risultatoToListAsync
: Esegue il metodo Table in modo asincrono
Il codice seguente illustra un esempio di come usare il metodo ToListAsync
per recuperare i record in modo asincrono:
SQLiteAsyncConnection conn;
ObservableCollection<User> userList; // Bound to UI
...
public async Task AddAllUsersAsync()
{
List<User> users = await conn.Table<User>().ToListAsync();
// Must be on UI thread here!
foreach (var u in users)
userList.Add(u);
}
In questo esempio, il metodo ToListAsync
recupera tutti gli utenti dal database in modo asincrono. Se si usa questo metodo, l'interfaccia utente rimane reattiva anche in presenza di un numero elevato di utenti nel database.