Xamarin формы 4.x панель поиска падает при изменении текста - PullRequest
0 голосов
/ 17 февраля 2020

Краткое содержание: программа позволяет пользователю иметь список игроков. У меня есть так, что пользователь может добавлять игроков в базу данных SQLite и изменять или удалять их. Я пытаюсь создать соответствие между игроками, идея заключается в том, что пользователь будет использовать панель поиска, чтобы найти имя и выбрать его из быстрого списка по мере их ввода. Я искал способы использования SearchBar и как получить доступ к указанным c данным из базы данных SQLite, и я думаю, что у меня есть список Игроков на выбор. Но когда я запускаю программу и пытаюсь найти имя, она падает по первой букве, и Visual Studio сообщает об ошибке: SQLite.SQLiteException: «нет такого столбца: a» (где «a» - первая введенная мной буква ). На заднем плане - сообщение: Ваше приложение вошло в состояние останова, но нет кода для показа, потому что все потоки выполняли внешний код (обычно системный или структурный код).

Вот как я его установил вверх. Вот строка поиска в MatchEntryPage.xmal

                    <StackLayout>
                        <SearchBar Grid.Row="1"
                                   Grid.Column="0"
                                   Grid.ColumnSpan="3"
                                   Placeholder="Player 1"
                                   TextChanged="OnPlayer1SearchTextChanged"
                                   x:Name="Player1SearchBar" />
                        <ListView x:Name="Player1SearchList"
                                  Footer="" />
                    </StackLayout>

Вот как я могу обработать изменение текста в MatchEntryPage.xmal.cs

async void OnPlayer1SearchTextChanged(object sender, EventArgs e)
    {
        Player1SearchList.ItemsSource = await 
            App.Database.GetPlayersByNameAsync(Player1SearchBar.Text);
    }

В определении класса проигрывателя PlayerDatabase.cs здесь это функция:

    public async Task<List<Player>>GetPlayersByNameAsync(string name)
    {
        List<Player> result = await _database.QueryAsync<Player>("SELECT * from Player where 
             PlayerName LIKE " + name);
        return result;
    }

Дополнительные примечания: В некоторых чтениях, которые я упоминал, рекомендуется не использовать SQL напрямую, но я не уверен, как это сделать. Кроме того, здесь есть другие функции в PlayerDatabase.cs, которые я могу использовать для заполнения ListView для отображения полного списка игроков в базе данных

    readonly SQLiteAsyncConnection _database;

    public PlayerDatabase(string dbPath)
    {
        _database = new SQLiteAsyncConnection(dbPath);
        _database.CreateTableAsync<Player>().Wait();
    }

    public Task<List<Player>> GetPlayersAsync()
    {
        return _database.Table<Player>().ToListAsync();
    }

    public Task<Player> GetPlayerAsync(int id)
    {
        return _database.Table<Player>()
            .Where(i => i.ID == id)
            .FirstOrDefaultAsync();
    }

1 Ответ

0 голосов
/ 17 февраля 2020

Изменение:

 public async Task<List<Player>>GetPlayersByNameAsync(string name)
    {
        List<Player> result = await _database.QueryAsync<Player>("SELECT * from Player where 
             PlayerName LIKE " + name);
        return result;
    }

на

 public async Task<List<Player>>GetPlayersByNameAsync(string name)
    {
        List<Player> result = await _database.QueryAsync<Player>("SELECT * from Player where 
             PlayerName LIKE '%" + name+ "%');
        return result;
    }

Но вы должны использовать SqlParameter вместо переменных напрямую. Чтобы повысить производительность и избежать sql -инъекций - читайте здесь: C# Параметризация SQLite Select с использованием LIKE


Я не использую SqlLite, но это возможно написать:

    public Task<IEnumerable<Player>> GetPlayerWithNamesOfAsync(string wildcardName)
    {
        return _database.Table<Player>()
            .Where(p => p.PlayerName.Contains(wildcardName))
            .ToArrayAsync();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...