以非同步方式使用 SQLite

已完成

如果您以同步方式在資料庫上執行查詢,可能會導致效能問題和應用程式無回應的情況。 SQLite-net 具有非同步的 API,可讓您用來讓應用程式保持回應。

在本單元中,您將了解如何使用 SQLite-net 的非同步 API,以確保您的應用程式保持高度回應性。

了解非同步查詢

到目前為止,您已在 UI 執行緒上執行所有資料庫作業。 不過,若要建置高度回應的行動應用程式,您可能需要採取略為不同的方式。 如果您在 UI 執行緒上執行資料庫作業,而作業需要很長時間才能完成,可能會導致 UI 凍結。

為了解決此問題,SQLite-net 會包含透過 SQLiteAsyncConnection 類別的非同步 API。 例如,若要以非同步方式建立資料表,您可以使用 CreateTableAsync 方法:

var conn = new SQLiteAsyncConnection(dbPath);
await conn.CreateTableAsync<User>();

執行非同步作業使用 SQLite-net

SQLiteAsyncConnection 類別會公開與其同步對應項目類似的作業。 但是,作業都是工作型的背景使用方式。

常見的可用非同步作業包括:

  • CreateTableAsync:依據指出的類別建立資料表

  • DropTableAsync:卸除與指出類別相互關聯的資料表

  • GetAsync:取得與指出類別相關聯資料表中的記錄,並且比對傳入建構函式中的主索引鍵

  • InsertAsync:使用傳入建構函式的項目來插入新記錄

  • UpdateAsync:使用傳入建構函式的項目來更新現有的記錄

  • DeleteAsync:刪除資料表中對應至指出類別的記錄,並且比對傳入建構函式中的主索引鍵

  • QueryAsync:執行直接 SQL 查詢並傳回物件

  • ExecuteAsync:執行直接 SQL 查詢並傳回受影響的資料列數目

  • ExecuteScalarAsync:執行直接 SQL 查詢並傳回單一結果

  • ToListAsync:以非同步的方式執行 Table 方法

下列程式碼顯示的範例為如何使用 ToListAsync 方法以非同步方式擷取記錄:

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);
}

在此範例中,ToListAsync 方法會以非同步方式從資料庫中擷取所有使用者。 如果您使用此方法,可確保即使資料庫中有大量使用者,您的 UI 仍能保持回應。