我有一个页面,我要在其中编辑对象,然后更新数据库中的对象。我在“保存”按钮单击事件下有这个选项:
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;
}
答案 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
访问器。