Асинхронное использование 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 метод асинхронно извлекает всех пользователей из базы данных. Этот метод гарантирует, что пользовательский интерфейс продолжает отвечать, даже если в базе данных множество пользователей.