如何更新存储在 SQLite 数据库中的对象

How to update object stored inside an SQLite DB

我有一个页面,我想在其中编辑一个对象,然后更新数据库中的对象。我在这个保存按钮点击事件下有这个:

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() 方法编辑对象时 returns false 而对象没有得到更新,我不知道为什么。

产品Class:

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;
}

从数据库检索时未设置产品 Id 的问题是您将 Id 属性 设置为 private set,这意味着SQLite 实际上无法设置 属性 值,因此它仍然为 0。只需从 setter 中删除 private,一切都应该正常 :-) .

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

另请注意:您正在 OnNavigatedTo 覆盖中创建局部变量 Product p = data.GetProductById(id);,这是一个问题,因为在 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.

时,请确保您的产品 ID 实际设置为现有 ID

public int Id { get; private set; }是你的问题。

删除 private 访问器。