Usare SQLite in modo asincrono

Completato

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à verrà 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 sono state eseguite sul thread dell'interfaccia utente. 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 indicata

  • DropTableAsync: Elimina la tabella correlata alla classe indicata

  • GetAsync: Ottiene il record nella tabella correlata alla classe indicata e associa la chiave primaria passata nel costruttore

  • InsertAsync: Inserisce un nuovo record usando l'elemento passato nel costruttore

  • UpdateAsync: Aggiorna un record esistente usando l'elemento passato nel costruttore

  • DeleteAsync: Elimina il record nella tabella mappata alla classe indicata e associa la chiave primaria passata nel costruttore

  • QueryAsync: Esegue una query SQL diretta e restituisce un oggetto

  • ExecuteAsync: Esegue una query SQL diretta e restituisce il numero di righe interessate

  • ExecuteScalarAsync: Esegue una query SQL diretta e restituisce il singolo risultato

  • ToListAsync: 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.