Проблема с тем, что 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
.