11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NRI OpenStandiaAdvent Calendar 2024

Day 13

Supabase×SwiftUIで、お手軽ToDoアプリ開発

Last updated at Posted at 2024-12-12

Supabaseとは

IMG_2311.png

Supabaseとは、BaaS(Backend as a Service)と呼ばれるサービスの1つで、データベース・認証・ストレージなどの様々な機能を提供しています。
今回Supabaseを触ってみようと思ったきっかけは、データベースで RDBMS(PostgreSQL)
を利用できることです。FirebaseのNoSQLを利用している際に届かなかった、かゆいところに手が届きます。
また、今回実験した範囲であれば、クレカ登録無しで試せるので気軽に遊べます。

今回作るもの

簡易的なCRUD機能を持つToDoアプリを作ります。フロントはSwiftUI、バックエンドにSupabaseを利用します。

操作 説明
C 新規タスク登録
R SupabaseのDBよりタスクの読み込み
U 完了/未完了ステータスの更新
D タスクの消去

Supabaseライブラリの導入

Swift Package Manager(SPM)よりライブラリを追加します。
image.png

インポートしたところ、"No such modele 'Supabase'"のエラーが出て、正しく認識されず。

image.png

TARGETに追加されていないことが原因のようでした。TARGETSのGeneralタブの Frameworks, Libraries, and Embedded Contentに追加することで解決できました。以下の記事を参考にしました。

image.png

Supabaseでプロジェクト作成

以下の要素を持つtodosテーブルを作成する。

  • id
  • title(タスク名)
  • is_completed(完了/未完了フラグ)

image.png

サイドバー→Authentication→Policiesより簡易的なポリシーを設定しました。
今回は認証無しで作成しました。

alter policy "todos_policy"
on "public"."todos"
to public
using (
  true
);

クライアントからのAPI呼び出し

SupabaseClientの設定

let supabase = SupabaseClient(
    supabaseURL: URL(string: APIKey.URL)!,
    supabaseKey: APIKey.KEY
)

タスクの追加

func addTodo(title: String) async {
        do {
            let newTodo = Todo(id: nil, title: title, isCompleted: false)
            try await supabase
                .from("todos")
                .insert(newTodo)
                .execute()
            await fetchTodos()
        } catch {
            print("Error adding todo: \(error)")
        }
    }

タスクの取得

func fetchTodos() async {
        do {
            let data = try await supabase
                .from("todos")
                .select()
                .execute()
                .data
            let todos = try JSONDecoder().decode([Todo].self, from: data)
            await MainActor.run {
                self.todos = todos
            }
        } catch {
            print("Error fetching todos: \(error)")
        }
    }

タスク状況の更新

func updateTodo(_ todo: Todo) async {
        do {
            try await supabase
                .from("todos")
                .update(todo)
                .eq("id", value: todo.id!)
                .execute()
            await fetchTodos()
        } catch {
            print("Error updating todo: \(error)")
        }
    }

タスクの削除

func deleteTodo(_ todo: Todo) async {
        do {
            try await supabase
                .from("todos")
                .delete()
                .eq("id", value: todo.id!)
                .execute()
            await fetchTodos()
        } catch {
            print("Error deleting todo: \(error)")
        }
    }

GUI上からDB操作可能です。

image.png

サイドバーのSQL Editorよりクエリ実行が可能です。

image.png

20241212_103639.gif

最後に

SwiftUIで実装したこともあり、ToDoアプリがとても簡単に実装できました。皆様も良ければ遊んで見てください。個人的には1人ハッカソンで、バックエンドをSupabaseに全部任せたいです!

参考

Supabase社のエンジニアのタイラーさんが色々なSupabase活用例を公開しています。
数年前から話題になっているSupabaseですが、今後より一層人気が高まるのではないでしょうか!

11
2
0

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
11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?