QueryAsync не тянет правильные данные - PullRequest
0 голосов
/ 04 мая 2019

Сначала я запускаю приведенную ниже строку кода, получая следующий результат: (показывает изображение только для справки)

var query_user1 = await _connection.QueryAsync<FavoritesProfile>("SELECT * FROM FavoritesProfile");

enter image description here

Таким образом, в моей таблице данных, очевидно, есть FavoritesProfile, загруженный значениями User = "Shane" и Titles = "The Avengers". Однако, когда я пробую следующую строку кода, я получаю исключение.

 var query_user = await _connection.QueryAsync<FavoritesProfile>("SELECT FROM FavoritesProfile WHERE User LIKE '%" + user + "%' AND Titles LIKE '%" + _movie.Title + "%'");

Я убедился, что user является строкой, а _movie.Title также является строкой. Которые также оба соответствуют Шейну и Мстителям соответственно. Я также добавлю весь код из класса на случай, если проблема будет в другом месте. Если у вас есть какие-либо идеи, это будет с благодарностью. Я знаю, что не реализую базу данных SQLite самым чистым способом.

    using Xamarin.Forms;
using System;
using MovieApp.Services;
using MovieApp.Models;
using SQLite;
using MovieApp.Persistance;

namespace MovieApp.Views
{
    public partial class MovieDetailsPage : ContentPage
    {
        private MovieService _movieService = new MovieService();
        private Movie _movie;
        private SQLiteAsyncConnection _connection;
        private string user = MainPage._username; //simplicity purposes as we didn't implement fully functions login page

        public class FavoritesProfile
        {
            [PrimaryKey, AutoIncrement]
            public int Id { get; set; }

            [MaxLength(255)]
            public string User { get; set; }

            [MaxLength(255)]
            public string Titles { get; set; }
        }
        public MovieDetailsPage(Movie movie)
        {
            if (movie == null)
                throw new ArgumentNullException(nameof(movie));

            _movie = movie;

            InitializeComponent();

            _connection = DependencyService.Get<ISQLiteDb>().GetConnection();
        }

        protected override async void OnAppearing()
        {
            var query_user1 = await _connection.QueryAsync<FavoritesProfile>("SELECT * FROM FavoritesProfile");
            //will create table if it does not already exist
            await _connection.CreateTableAsync<FavoritesProfile>();



            //BindingContext = await _movieService.GetMovie(_movie.Title);
            BindingContext =  _movie;

            CheckForFavoriteAsync();

            base.OnAppearing();
        }

        private async void CheckForFavoriteAsync()
        {
            try
            {
                var query_user = await _connection.QueryAsync<FavoritesProfile>("SELECT FROM FavoritesProfile WHERE User LIKE '%" + user + "%' AND Titles LIKE '%" + _movie.Title + "%'");
                if (query_user.Count >= 1)
                    favoriteicon.Icon = "star_filled.png";
            } catch (Exception) {

            }
        }

        public async void Favorite_Clicked(object sender, EventArgs e)
        {   

            if(favoriteicon.Icon == "star_filled.png")
            {
                //unadd from favorites  for user
                try
                {
                    var query_user = await _connection.QueryAsync<FavoritesProfile>("DELETE FROM FavoritesProfile WHERE User LIKE '%" + user + "%' AND Titles LIKE '%" + _movie.Title + "%'");
                } catch (Exception)
                {

                }

                favoriteicon.Icon = "star_unfilled.png";
            } 
            else
            {
                var query_user2 = await _connection.QueryAsync<FavoritesProfile>("SELECT * FROM FavoritesProfile");
                //add to favorites for user
                try
                {
                    var query_user = await _connection.QueryAsync<FavoritesProfile>("SELECT FROM FavoritesProfile WHERE User LIKE '%" + user + "%' AND Titles LIKE '%" + _movie.Title + "%'");
                } catch (Exception)
                {
                    var favorites = new FavoritesProfile { User = user, Titles = _movie.Title };
                    await _connection.InsertAsync(favorites);
                }

                favoriteicon.Icon = "star_filled.png";
            }


        }

    }
}

В целом мой запрос на удаление работает так же, как и мои общие запросы Select *, но я не могу заставить другой отфильтровать и вернуть мне результат, которым он должен быть. Я просто хочу получить результат, когда уже есть запись с именем пользователя и movieTitle, чтобы я мог заполнить значок, чтобы показать пользователю, что он уже добавил этот фильм в избранное.

1 Ответ

1 голос
/ 05 мая 2019

Ваш второй запрос содержит недопустимый оператор SELECT. Вам необходимо указать, какие столбцы вы выбираете.

Эта строка:

var query_user = await _connection.QueryAsync<FavoritesProfile>("SELECT FROM FavoritesProfile WHERE User LIKE '%" + user + "%' AND Titles LIKE '%" + _movie.Title + "%'");

Вероятно, должно быть

var query_user = await _connection.QueryAsync<FavoritesProfile>("SELECT * FROM FavoritesProfile WHERE User LIKE '%" + user + "%' AND Titles LIKE '%" + _movie.Title + "%'");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...