Как обновить объект, хранящийся в БД SQLite - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть страница, где я хочу отредактировать объект, а затем обновить объект в БД.У меня есть это под этим событием нажатия кнопки сохранения:

private async void saveButton_Click(object sender, RoutedEventArgs e)
{
    p.ProductName = nameTextBox.Text;
    p.Price = double.Parse(priceTextBox.Text);
    p.Quantity = int.Parse(quantityTextBox.Text);
    p.Description = descTextBox.Text;

    if (data.UpdateProduct(p))
    {
        MessageDialog md = new MessageDialog("Product changes updated", "UPDATE OUTCOME");
        await md.ShowAsync();
    }
    else
    {
        MessageDialog md = new MessageDialog("Product changes NOT updated", "UPDATE OUTCOME");
        await md.ShowAsync();
    }

    Frame.Navigate(typeof(MainPage));
}

Метод UpdateProduct() выглядит следующим образом:

public bool UpdateProduct(Product product)
{
    if (conn.Update(product) > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Всякий раз, когда я пытаюсь отредактировать объект, возвращается метод UpdateProduct()false и объект не обновляется, я не могу понять, почему.

Класс продукта:

public class Product
{
    [PrimaryKey AutoIncrement]
    public int Id { get; private set; }
    public string ProductName { get; set; }
    public double Price { get; set; }
    public int Quantity { get; set; }
    public string Description { get; set; }

    public override string ToString()
    {
        return $"Product ID: {this.Id}, Product Name: {this.ProductName}, Price: {this.Price}, Quantity: {this.Quantity}";
    }
}

ОБНОВЛЕНИЕ Если это обеспечит более глубокое понимание,продукт извлекается из БД примерно так:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    int id = (int)e.Parameter;
    Product p = data.GetProductById(id);

    nameTextBox.Text = p.ProductName;
    priceTextBox.Text = p.Price.ToString();
    quantityTextBox.Text = p.Quantity.ToString();
    descTextBox.Text = p.Description;
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

public int Id { get; private set; } - это ваша проблема.

Снимите аксессор private.

0 голосов
/ 11 декабря 2018

Проблема с тем, что Id вашего продукта не установлена ​​при извлечении из БД, заключается в том, что вы установили для свойства Id значение private set, что означает, что SQLite фактически не может установить значение свойства и, следовательно, оно остается равным 0Просто удалите private из сеттера, и все должно работать нормально :-).

public class Product
{
    [PrimaryKey AutoIncrement]
    public int Id { get; set; }
    ...
}

Также обратите внимание : вы создаете локальную переменную Product p = data.GetProductById(id); в OnNavigatedToпереопределить, что является проблемой, потому что в методе saveButton_Click вы используете другой экземпляр p (я предполагаю поле), который тогда, вероятно, не инициализируется.

Вам необходимо убедиться, что вы используетев обоих случаях одна и та же переменная, чтобы убедиться, что id, полученный вами из БД, установлен:

private Product _updatedProduct;

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    int id = (int)e.Parameter;
    //assign to the private field
    _updatedProduct = data.GetProductById(id);

    nameTextBox.Text = _updatedProduct.ProductName;
    priceTextBox.Text = _updatedProduct.Price.ToString();
    quantityTextBox.Text = _updatedProduct.Quantity.ToString();
    descTextBox.Text = _updatedProduct.Description;
}

private async void saveButton_Click(object sender, RoutedEventArgs e)
{
    //update properties of the private field
    _updatedProduct.ProductName = nameTextBox.Text;
    _updatedProduct.Price = double.Parse(priceTextBox.Text);
    _updatedProduct.Quantity = int.Parse(quantityTextBox.Text);
    _updatedProduct.Description = descTextBox.Text;

    if (data.UpdateProduct(_updatedProduct))
    {
        MessageDialog md = new MessageDialog("Product changes updated", "UPDATE OUTCOME");
        await md.ShowAsync();
    }
    else
    {
        MessageDialog md = new MessageDialog("Product changes NOT updated", "UPDATE OUTCOME");
        await md.ShowAsync();
    }

    Frame.Navigate(typeof(MainPage));
}

Исходный ответ : Product, вероятно, имеет столбец Idкакой SQLite использует, чтобы определить, какая строка в базе данных должна быть обновлена.Убедитесь, что идентификатор вашего продукта фактически установлен на существующий идентификатор, когда вы звоните Update.

...