以非同步方式使用 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 仍能保持回應。