Асинхронное использование SQLite
Синхронное выполнение запросов в базе данных может привести к проблемам с производительностью и отсутствием ответа в приложениях. Для SQLite.NET существует асинхронный интерфейс API, который можно использовать для поддержания отклика от приложения.
В этом уроке вы узнаете, как использовать асинхронный API SQLite-net, чтобы обеспечить высокую скорость реагирования приложения.
Сведения об асинхронных запросах
До этого момента вы выполнили все операции базы данных в потоке пользовательского интерфейса. Но для создания быстродействующего мобильного приложения нужно кое-что изменить. Если вы выполняете операции с базой данных в потоке пользовательского интерфейса, это может привести к "зависанию" пользовательского интерфейса, когда операция занимает много времени.
Чтобы решить эту проблему, SQLite-net включает асинхронный API через SQLiteAsyncConnection
класс. Например, чтобы создать таблицу асинхронно, можно использовать 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
метод асинхронно извлекает всех пользователей из базы данных. Этот метод гарантирует, что пользовательский интерфейс продолжает отвечать, даже если в базе данных множество пользователей.