こんにちは!atomuです!
今回は少し困ったことに出会ったので久しぶりに記事を書いてみました!
【本題】 FlutterでSupabaseに値を追加できない
個人開発でSupabaseを使っていて、ユーザーのGoogle認証まではなんとかいけたのですが。。
ユーザーの名前などの情報をdatabaseを使って保存しようと思ったら!!
全く追加されないのです!
まずは私の解決前のコードです☟
final userId = supabase.auth.currentUser!.id;
final username = _nameController.text.trim();
await supabase.from('profiles').update({
'username': username,
// the list has place name
'places': userPlacesList,
}).eq('id', userId);
}
このコードでは、supabase上でprofilesというデータベースを作成しログインしているユーザーのidとusernameとuserPlacesListというリストを格納しようとしています。
eqというのはidというカラムがユーザーのidと等しいところにupdateメソッドを使って値を更新するということです。
しかし、いくらリロードをしても追加されませんでした!
それもそのはず!
調べてみると、updateメソッドでは今データベース上にある値を更新しているということで値の追加はしないのです!
【解決策】 updateではなくupsertを使う
こちらが解決後のコードです☟
final userId = supabase.auth.currentUser!.id;
final username = _nameController.text.trim();
await supabase.from('profiles').upsert({
'id': userId,
'username': username,
'places': userPlacesList,
});
このようにupsertメソッドを使うことで、もしprofilesにこのユーザーのidの値が格納されていなかったら新たに列を追加し、profilesに格納されていたらその値を更新するという便利なことができるようになりました!userIdは同じユーザーでは変わらないので、そこでデータがあることの区別をしています。
この問題に丸1日かけ、分からなさすぎてStackOverFlowに投稿しました!(誰からもanswerが来なかった伝説)
(Database of Supabase UPDATE doesn't work on Flutter)
【まとめ】
- FlutterでSupabaseに値を追加できない場合はメソッド名を疑う
- 今回の場合はupdateではなくてupsertだった
- Supabase面白いーーー
ここまで読んでいただきありがとうございました!
この記事が同じ問題に困っている人に届くことを願っています!
何か質問やここ間違っているよ!みたいなことがあればお気軽にコメントください!
【参考】