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

时间:2018-12-11 07:57:33

标签: c# uwp uwp-xaml sqlite-net

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

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 :(得分:1)

从数据库中检索产品时,未设置产品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时,请确保您的产品ID实际上设置为现有ID。

答案 1 :(得分:0)

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

删除private访问器。