Xamarin формы, Sqlite ждать DeleteAsync - PullRequest
0 голосов
/ 30 марта 2020

Я изучаю Xamarin, я использую функцию для удаления всей моей базы данных sqlite, добавления новых элементов и ссылки sh моего списка просмотра.

код останавливается, я думаю, что это потому, что у него нет времени на удаление сначала добавьте в базу данных, затем обновите список sh. Когда я добавляю таймер (2 секунды), он работает.

Вот ошибка в строке "mywordsdatabase.DeleteAllWords ();"; : System.ArgumentOutOfRangeException: 'Индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: index '

Я использую этот плагин sqlite введите описание ссылки здесь

Вот функция:

public async void DeleteAndUpdate(){

mywordsdatabase.DeleteAllWords(); // the error occur here

List<MyWords> WordUserList = await wordmanager.GetWordAsync(UserConnected.MyId);

foreach (MyWords w in WordUserList)
{
    mywordsdatabase.AddWord(w);

}


var WordList = await mywordsdatabase.GetWords();


Device.BeginInvokeOnMainThread(() => { WordSList.ItemsSource = WordList; });
}

Вот Функция удаления для sqlite:

class MyWordsDatabase
{
    private SQLiteAsyncConnection conn;

//CREATE  
    public MyWordsDatabase()
    {
        conn = DependencyService.Get<ISQLite>().GetConnection();
        conn.CreateTableAsync<MyWords>();
    }

      public string AddWord(MyWords mywords)
        {
            conn.InsertAsync(mywords);
            return "success";
        }
    public string DeleteAllWords()
    {
        conn.DeleteAllAsync<MyWords>();
        return "success";
    }
}

Спасибо за помощь

Ответы [ 4 ]

0 голосов
/ 30 марта 2020
public async Task<string> AddWord(MyWords mywords)
    {
        string result=string.Empty;
        try
        {
           await conn.InsertAsync(mywords);
        }
        catch (Exception ex)
        {
        }
        return result;
    }
    public async Task<string> DeleteAllWords()
    {
        string result = string.Empty;
        try
        {
            await conn.DeleteAllAsync<MyWords>();
        }
        catch (Exception ex)
        {
        }
        return result;
    }

    public async void DeleteAndUpdate()
    {
        try
        {
           await mywordsdatabase.DeleteAllWords(); // the error occur here
            List<MyWords> WordUserList = await wordmanager.GetWordAsync(UserConnected.MyId);
            foreach (MyWords w in WordUserList)
            {
              await  mywordsdatabase.AddWord(w);

            }
            var WordList = await mywordsdatabase.GetWords();
            Device.BeginInvokeOnMainThread(() => { WordSList.ItemsSource = WordList; });
        }
        catch (Exception ex)
        {
        }
    }
0 голосов
/ 30 марта 2020

Несколько вещей для проверки, прежде всего убедитесь, что в базе данных действительно есть слова, которые нужно удалить, поскольку ошибка может указывать на то, что она пыталась работать с нулевым элементом. Во-вторых, поскольку метод asyn c, посмотрите, поможет ли изменение подписи.

Таким образом, вместо public string DeleteAllWords() он становится public async string DeleteAllWords(), тогда внутри метода мы можем сказать await conn.DeleteAllAsync<MyWords>();, и где мы его называем, мы можем затем сделать await mywordsdatabase.DeleteAllWords();

Как сказал jmcil, Код asyn c не будет ждать, пока его операция остановит выполнение, если ему не будет приказано это сделать.

0 голосов
/ 30 марта 2020

Пожалуйста, измените ваш метод DeleteAllWords, как следующий метод.


 public Task<int> DeleteAllNotesAsync()
        {
            return conn.DeleteAllAsync<MyWords>();   
        }

Затем оцените возвращаемое значение, если оно больше 0, это возвращаемое значение больше 0, это означает, что удаление удаляется, как этот простой код .

  private async void Button_Clicked(object sender, EventArgs e)
        {
            int deleteRecord= await App.Database.DeleteAllNotesAsync();
            if (deleteRecord>0)
            {
                await DisplayAlert("Success", "delete" + deleteRecord, "OK");
            }

        }
0 голосов
/ 30 марта 2020

Весь смысл асинхронных методов в том, что они асинхронные, то есть они возвращаются немедленно, в то время как начатая ими работа продолжается в фоновом режиме. Если вы вызываете этот метод DeleteAllAsync, а затем немедленно начинаете выполнять код, как если бы он завершил удаление всего, тогда, конечно, у вас будут проблемы. Если вам нужно, чтобы удаление было выполнено до того, как будет выполнен последующий код, то вам нужно дождаться завершения удаления, прежде чем выполнять этот последующий код. Способ сделать это, скорее всего, ждет ожидающих методов в вашем коде. Это:

public string DeleteAllWords()
{
    conn.DeleteAllAsync<MyWords>();
    return "success";
}

, вероятно, должно быть так:

public async Task<string> DeleteAllWordsAsync()
{
    await conn.DeleteAllAsync<MyWords>();
    return "success";
}

Это означает, что вы можете ожидать вызова этого метода:

await mywordsdatabase.DeleteAllWordsAsync();

или вы может перехватить Task, который он возвращает, выполнить некоторый код, который не зависит от его завершения, а затем дождаться Task позже:

var t = mywordsdatabase.DeleteAllWordsAsync();

// ...

await t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...