前のページはこちら

それでは、データの追加と変更を行います。

コード変更

supabase_repository.dartのDBUpdateを下記のように変更します。

  static Future<bool> DBUpdate({name}) async {
    try {
      var supabase = Supabase.instance.client;

      final updates = {
        'id': supabase.auth.currentUser!.id,
        'username': name,
        'updated_at': DateTime.now().toIso8601String(),
      };

      final response =
          await supabase.from('profiles').upsert(updates).execute();

      if (response.error != null) {
        print("エラーです" + response.error!.message);
        throw new Exception(response.error);
      }
      return true;
    } catch (e) {
      return false;
    }
  }

解説

データベースアクセスインスタンス生成

Auth用のアクセスインスタンスがSupabase.instance.client.authでしたが、DBアクセス用のインスタンスはSupabase.instance.clientそのものとなります。(この中にAuthも含まれている感じなんですかね)

var supabase = Supabase.instance.client;

アップデートするためのMAP型オブジェクトを作る

supabaseのDBのアップデートをするためのMap<String, dynamic>オブジェクトを作ります。

      final updates = {
        'id': supabase.auth.currentUser!.id,
        'username': name,
        'updated_at': DateTime.now().toIso8601String(),
      };

ログイン中のユーザーID

Key「id」にログイン中のIDを渡しています。

'id'  :   supabase.auth.currentUser!.id,

文字列

Key「username 」には文字列を直接入れています。

'username '  :   name,

この「name」はこの関数が呼ばれる時に受け取っているもので、auth_page_view.dartが自身のテキストフィールドの内容を入れています。(興味があればご確認ください)

現在時刻(DateTimeTimeStampzコンバート含む)

Key「username 」に現在時刻を入れます。

が、今回は少し注意が必要です。supabase側で日付時間を表現するTimeStampzが型になっている場合、DartのDateTimeを入れる際はコンバートをする必要があります。『.toIso8601String()』を付ける事で変換が可能です。

'updated_at'  :   DateTime.now().toIso8601String()

supabase.fromとupsert

最後に、作ったMAP型をsupabaseのprofilesに反映させます。

final response = await supabase.from('profiles').upsert(updates).execute();

supabase.from(テーブル名文字列)がアクセスするテーブル指定です。

また『upsert』は、update+insertなコマンドです。指定したキーが無い場合は新しく追加され、そのキーを持つレコードがある場合は変更される柔軟な動きをします。

先ほどのコードで’profiles’というテーブルに対し、先ほど作ったMAPオブジェクトのupdatesを渡しupsertを実行してもらいます。さらにその結果をawaitで待ち、responseに結果が入れられます。

upsertの他にも純粋なupdateinsertも存在するので、そのうち記事に書きたいです。

実行

ログインをした状態で、「名前変更」の上にあるテキストフィールドに文字を入れて「名前変更」を押すとログイン中のユーザーの名前が変更になります。(別のユーザーの名前を変更する場合は、そのユーザーのemailとパスワードを入れてログインをします)

今回は、下記のようなオペレーションをしてみました。

  • test@test.com、test2@test.com、test3@test.comを作成
  • test@test.comでログイン、「たなかいちろう」を入れて「名前変更」を押す(上のイメージ)
  • test2@test.comでログイン、「すずきじろう」を入れて「名前変更」を押す
  • test3@test.comでログイン、「たなかさぶろう」を入れて「名前変更」を押す

supabeseのコンソール画面でデータベースを確認すると、データが入っている事が確認できます。

また、Auth画面で確認できるUser UIDと今回のprofilesテーブルのidに入っているものが同一な事も確認が出来ます。

次のページはこちら