如何更新存储在 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
访问器。
我有一个页面,我想在其中编辑一个对象,然后更新数据库中的对象。我在这个保存按钮点击事件下有这个:
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
.
public int Id { get; private set; }
是你的问题。
删除 private
访问器。