Я работаю с Firebase в .NET MAUI, используя пакет firebase-database-dotnet, и мне нужна помощь в сборе ключей узлов (идентификаторов) продуктов, полученных из Firebase.
Структура данных в Firebase выглядит следующим образом:
products
product1
category: "dairy"
description: "Sliced Arequipe cheese, ideal for accompanying your meals."
name: "Arequipe Cheese Sliced"
price: 10.99
product10
category: "dairy"
description: "Box of 30 Kikes eggs."
name: "Kikes Eggs 30 pcs"
price: 3.99
У меня есть следующий метод получения продуктов из Firebase:
public async Task<IEnumerable<T>> GetItemsAsync(bool forceRefresh = false)
{
try
{
var firebaseObjects = await _query
.OnceAsync<T>();
return firebaseObjects
.Select(x => x.Object);// Devuelve los FirebaseObject<T> completos
}
catch (Exception ex)
{
return null;
}
}
Этот метод возвращает объекты продукта, но я не знаю, как получить ключи узла (продукт1, продукт10 и т. д.).
Теперь я хочу реализовать метод сохранения выбранного продукта в Firebase, и мне нужно получить идентификатор узла, соответствующий продукту. Например:
[RelayCommand]
public async Task SaveProduct(Product product)
{
// Here, I want to use the GetItemsAsync method to retrieve the existing products.
// How can I capture the node ID (such as 'product1' or 'product10') of the selected product?
}
Можно ли включить идентификатор в таблицу или это считается плохой практикой? Как я могу захватить ключи узла вместе с данными в моем текущем
Вообще говоря, product1
,product10
и т. д. вы упомянули, генерируются автоматически.
Чтобы обновить специальный элемент в списке products
, мы обычно добавляем поле и гарантируем уникальность его значения.
Например:
public class Product
{
public string Name { get; set; }
//add field ID (it's value is unique)
public string ProductId{ get; set; }
}
Затем, если мы хотим обновить специальный продукт в списке products
, мы можем сначала перебрать список продуктов и найти элемент по полю ID
.
Вы можете обратиться к следующему фрагменту кода:
Product product = new Products();
product.Name = "product18";
if (btnSaveText == "UPDATE")
{
//other code
product.ProductId = "xxxxx";
var updateProduct = (await fClient.Child("Products").OnceAsync<Product>()).FirstOrDefault(x => x.Object.ProductId == products.ProductId);
if (updateProduct == null)
{
lblMessage = "Cannot find selected Product";
isBusy = false;
return;
}
await fClient
.Child("Products" + "/" + updateProduct.Key).PatchAsync(JsonConvert.SerializeObject(product));
lblMessage = "Product updated successfully";
}