因為進行 Xamarin 教學課程上的需要,因此,最近特別來研究與體驗如何使用 Firebase 的資料庫功能。
這篇文章的專案原始碼,可以從 這裡 取得
首先,建立起一個 Xamarin.Forms for Prism 專案,讓我們來體驗一下在 C# 中,使用 Firebase 來存取資料庫的應用。
- 在這個專案中,加入 FirebaseDatabase.net NuGet 套件
- 接著,我們建立一個資料模型類別,用來宣告要儲存在 Firebase 資料庫內的內容。在這裡,我們宣告一個 MyMoney 類別,用來記錄每筆消費紀錄項目。
public class MyMoney
{
public Guid Id { get; set; }
public string Title { get; set; }
public string InvoiceNo { get; set; }
public int Cost { get; set; }
}
- 現在,讓我們開始來使用 Firebase,在這個測試範例程式碼中,我們將會做到:將整個資料表刪除、查詢現在所有的紀錄、刪除指定的紀錄、找出特定的紀錄、修改某筆紀錄、新增10筆紀錄等功能。
View 的內容
底下是我們測試的頁面宣告
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XFFirebase.Views.MainPage"
Title="Firebase 資料庫存取測試">
<Grid
>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="80"/>
</Grid.RowDefinitions>
<Editor
Text="{Binding Output}"/>
<Button
Grid.Row="1"
Text="Start"
Command="{Binding StartCommand}"/>
</Grid>
</ContentPage>
ViewModel 的內容
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Firebase.Database.Query;
namespace XFFirebase.ViewModels
{
using System.ComponentModel;
using Prism.Events;
using Prism.Navigation;
using Prism.Services;
using XFFirebase.Models;
public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
{
public event PropertyChangedEventHandler PropertyChanged;
public string Output { get; set; }
public DelegateCommand StartCommand { get; set; }
private readonly INavigationService _navigationService;
public MainPageViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
StartCommand = new DelegateCommand(async () =>
{
Output = "建立與 Firebase 連線";
var client = new Firebase.Database.FirebaseClient("https://xamarindb-3408d.firebaseio.com");
var child = client.Child("MyMoneys");
Output = Environment.NewLine + Environment.NewLine + "刪除掉所有的資料";
await child.DeleteAsync();
Console.WriteLine("產生 10 筆購物紀錄");
for (int i = 1; i < 10; i++)
{
await child.PostAsync<MyMoney>(new MyMoney()
{
Id = Guid.NewGuid(),
Title = $"冷泡茶 {i} 瓶",
InvoiceNo = $"0000 {i}",
Cost = 20 * i,
});
}
Output += Environment.NewLine + Environment.NewLine + "列出 Firebase 中所有的紀錄";
var fooPosts = await child.OnceAsync<MyMoney>();
foreach (var item in fooPosts)
{
Output += Environment.NewLine + $"購買商品:{item.Object.Title} 價格:{item.Object.Cost}";
}
Output += Environment.NewLine + Environment.NewLine + "查詢購物價格小於 90 的紀錄";
var fooRec = fooPosts.Where(x => x.Object.Cost <= 90);
foreach (var item in fooRec)
{
Output += Environment.NewLine + $"購買商品:{item.Object.Title} 價格:{item.Object.Cost}";
}
Output += Environment.NewLine + Environment.NewLine + "刪除購物價格小於 90 的紀錄";
var fooRecDeleted = fooPosts.Where(x => x.Object.Cost <= 90);
foreach (var item in fooRecDeleted)
{
await child.Child(item.Key).DeleteAsync();
Output += Environment.NewLine + $"購買商品:{item.Object.Title} 價格:{item.Object.Cost} 已經被刪除";
}
Output += Environment.NewLine + Environment.NewLine + "列出 Firebase 中所有的紀錄";
fooPosts = await child.OnceAsync<MyMoney>();
foreach (var item in fooPosts)
{
Output += Environment.NewLine + $"購買商品:{item.Object.Title} 價格:{item.Object.Cost}";
}
Output += Environment.NewLine + Environment.NewLine + "查詢購物價格等於 140 的紀錄";
var foo140Rec = fooPosts.FirstOrDefault(x => x.Object.Cost == 140);
foo140Rec.Object.Cost = 666;
await child.Child(foo140Rec.Key).PutAsync(foo140Rec.Object);
Output += Environment.NewLine + $"購買商品:{foo140Rec.Object.Title} 的價格已經修正為 價格:{foo140Rec.Object.Cost}";
Output += Environment.NewLine + Environment.NewLine + "列出 Firebase 中所有的紀錄";
fooPosts = await child.OnceAsync<MyMoney>();
foreach (var item in fooPosts)
{
Output += Environment.NewLine + $"購買商品:{item.Object.Title} 價格:{item.Object.Cost}";
}
});
}
public void OnNavigatedFrom(NavigationParameters parameters)
{
}
public void OnNavigatingTo(NavigationParameters parameters)
{
}
public void OnNavigatedTo(NavigationParameters parameters)
{
}
}
}
底下是我們測試頁面的Vidwmodel 相關程式碼