LoginSignup
6
3

More than 1 year has passed since last update.

Firebase Realtime Database を C# から利用する

Last updated at Posted at 2021-08-31

はじめに

Firebase Realtime Database を C# で利用する方法の紹介です。
今回は、FirebaseDatabase.net というライブラリを利用しました。

Firebase Realtime Database とは

NoSQL クラウド データベースでデータの保管と同期を行うことができます。
データはすべてのクライアントにわたってリアルタイムで同期され、アプリがオフラインになっても引き続き使用できます。
公式ページは以下参照。
https://firebase.google.com/docs/database?hl=ja

Firebaseにはもう1つ Cloud Firestore というデータベースがあり、それとの違いは、インポート・エクスポート・一括更新に強く、書き込み・読み込みの頻度が高い場合にリーズナブルな所であり、容量1GBまでは無料利用可能です。
(Cloud Firestore の方が新しく、最近はそちらを使う人の方が多い気がします)
2つのデータベースの比較は、以下の記事を参照ください。
Firebase Realtime DatabaseとFirestoreを使い分けていこうなという話

C#での使い方

FirebaseDatabase.net というライブラリを使えば、簡単に Firebase Realtime Database を利用できます。
公式サイトは以下を参照ください。
https://github.com/step-up-labs/firebase-database-dotnet

Nuget という C#でのパッケージマネージャからダウンロードしてインストール可能です。
以降で、このライブラリの利用方法を紹介します。

認証方法(サーバー側で secret を利用)

最もシンプルな認証方法は、サーバー側での利用の際に Firebase Realtime Database の secret と URL の2つを設定することです。
下図の赤枠部分を書き換えるのみです。
詳しくは、公式サイトの以下を参照ください。
公式サイトの認証の説明はこちら
image.png

ただし、secret を用いた認証は Googleでは非推奨で、推奨する方法は以下に記載されています。
https://firebase.google.com/docs/admin/setup?hl=ja#c_1

データの取得方法

認証用にFirebaseClientクラスのインスタンスを作ったあと、赤枠のような感じで取得できます。
Childメソッドでパスを指定して、OrderByXXXメソッドで取得する順序を指定して、StartAtでフィルタして、LimitToFirstで取得件数を制限しています。
image.png

以下に、実際に Firebase にあるデータを取得する例を記します。

まず、データを取得・更新するためのサンプルクラスを以下のように定義します。

public class TestRecord
{
    public string Id { get; set; }
    public int IntValue { get; set; }
    public string StringValue { get; set; }
}

そのクラスを用いて、下図のように Firebase にデータが格納されていると仮定します。
items以下の2つのデータが、上記クラスに相当するデータです。

image.png

上図のデータの items 以下の要素一覧を取得する場合は、以下のように実装します。
OrderByメソッドを用いて IntValue の昇順で取得しています。

var firebase = new FirebaseClient("https://xxx.firebaseio.com/");
var items = await firebase
    .Child("items")
    .OrderBy("IntValue")
    .OnceAsync<TestRecord>();

データの編集方法

FirebaseClientクラスのインスタンスを作って、Childメソッドでパスを指定して、PutAsyncメソッドで登録および更新ができます。
同様に、DeleteAsyncメソッドで削除ができます。
image.png

以下に、実際に Firebase にあるデータを更新する例を記します。

下図のデータに対して、Items以下に新しい要素を追加したい場合を考えます。
image.png

"items/XXX" というパスを指定して、新しく作成した TestRecord クラスのインスタンスを PutAsync メソッドで指定することで、 "items/XXX" というパスに新しいデータを追加できます。
なお、すでにそのパスが存在する場合は、上書き更新になります。

TestRecord testRecord = new TestRecord(){ IntValue = 20, StringValue = "hoge"};
var firebase = new FirebaseClient("https://xxx.firebaseio.com/");
await firebase.Child("items/XXX").PutAsync(testRecord);

Azure Functions から利用する

よくあるユースケースとしては、Web APIを用いて、Firebase のデータを取得・更新することだと思います。
C# で Web API を作成する場合は、Azure Functions が便利です。

Azure には Azure Functions という Web API を公開できる機能があります。
Visual Sutudio を利用すれば、ポチポチボタンを押すだけで、簡単に Azure に Azure Functions を発行できます。
詳細な手順は以下を参照ください。
クイック スタート: Visual Studio を使用して Azure で初めての C# 関数を作成する

上記で Azure Functions のプロジェクトを Visual Studioで作成すると、メソッドのひな形まで作成されます。
あとは、そのメソッドの中身を書くだけで実現できます。

Firebase にアクセスするためのサービスを別途作ってあると仮定すると、実装イメージは以下のような感じになります。

[FunctionName("GetRecords")]
public static async Task<IActionResult> GetRecords(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    ILogger log)
{
    // Firebaseにアクセスするサービスを取得する
    var service = GetFirebaseService();
    // Firebaseからデータを取得する
    var records = await service.GetRecordsAsync<TestRecord>("items/");

    // 取得したデータを返す
    string responseMessage = string.Empty;
    foreach (var record in records)
    {
            responseMessage += record.ToString();
    }

    return new OkObjectResult(responseMessage);
}

Azure Functions から利用するサンプルプログラムについては、こちらに作成しましたので、よろしければ参照ください。
https://github.com/kojimadev/FirebaseRealtimeDatabaseService

まとめ

Firebase Realtime Database を C# の Azure Functions から利用する方法を紹介しました。

ちなみに私は、普段はエンジニアリングマネージャーとして、チームの皆で楽しく開発する施策を色々実施しています。詳しくは以下を参照ください。
1年以上かけて生産性倍増+成長し続けるチームになった施策を全部公開

Twitterでも開発に役立つ情報を発信しています → @kojimadev

6
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3