XAML in Xamarin.Forms 基礎篇 電子書

XAML in Xamarin.Forms 基礎篇 電子書
XAML in Xamarin.Forms 基礎篇 電子書

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書

2018/05/22

在 Xamarin-Forms 專案中,第一次體驗 Firebase 資料庫的使用

因為進行 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 相關程式碼

執行結果

Firebase執行結果

沒有留言:

張貼留言