Сначала я запускаю приведенную ниже строку кода, получая следующий результат: (показывает изображение только для справки)
var query_user1 = await _connection.QueryAsync<FavoritesProfile>("SELECT * FROM FavoritesProfile");
![enter image description here](https://i.stack.imgur.com/hJwRz.png)
Таким образом, в моей таблице данных, очевидно, есть 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, чтобы я мог заполнить значок, чтобы показать пользователю, что он уже добавил этот фильм в избранное.