質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

549閲覧

firebaseのRealtimeDatabaseにて、プロフィール情報を上書きする方法

sam3457

総合スコア52

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/03/22 15:14

編集2018/03/22 15:15

プロフィール情報(名前、アイコン画像)を、firebaseのRealtimeDatabaseに保存する機能を作っています。
イメージ説明

以下は変更ボタンが押された時のコードです。

swift

1//userdefaultとサーバに送る 2 @IBAction func changeProfile(_ sender: Any) { 3 4 //userdefaultに保存 5 let userDefault = UserDefaults.standard 6 7 //名前 8 let username = nameTextField.text 9 userDefault.set(username, forKey: "username") 10 11 //アイコン画像 12 var data: Data = Data() 13 if let image = iconImageView.image { 14 data = UIImageJPEGRepresentation(image, 0.1)! as Data 15 } 16 let encodedIcon = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) as String 17 userDefault.set(encodedIcon, forKey: "usericon") 18 19 20 //サーバに保存 21 let ref = Database.database().reference() 22 23 //アイコンを設定してない場合(初期設定のアイコン)はnilを送る 24 if iconImageView.image == UIImage(named: "user.png") { 25 let prof: Dictionary = ["username": username, "usericon": nil] 26 ref.child("profs").childByAutoId().setValue(prof) 27 28 } else { 29 30 //アイコンを設定している場合はそれを送る 31 let prof: Dictionary = ["username": username, "usericon": encodedIcon] 32 ref.child("profs").childByAutoId().setValue(prof) 33 } 34 }

この状態で変更ボタンを押すと、同一のユーザー(メアドとパスワードが同じ)のプロフィールが複数できてしまいます。
イメージ説明

同一ユーザーのプロフィール変更は1ユーザーに1profを割り当て、profsの中に「追加」ではなく既存のプロフィール情報に「上書き」する形にしたいのですが、それにはどう修正を加えれば良いでしょうか?

また、このアプリはSNSにするのですがそもそもよく使うプロフィール情報はこの様に設計するのは一般的ではないなどのご意見もありましたらそちらも一言教えていただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

swift

1ref.child("profs").childByAutoId().setValue(prof)

まず、こちらのコードで使われている childByAutoId() は、指定のreference以下に自動生成のユニークなIDを使ってreferenceを生成するものです。これはSNSでいえば新しい投稿をする時に、各投稿にふるIDをイメージしてみてください。

では、ユーザー情報の場合だと、同じユーザーで毎回保存するたびにIDが変わってしまうと困ります。そこで登場するのが Firebase Auth です。この機能を利用することでユーザーごとのID(uid)を取得することができ、データの保存先を指定する際にもuidを利用して上書きするような設計を実現することができます。Firebaseを使ってSNSのようなアプリケーションを作成する場合、ほとんどのアプリケーションがこの機能を使っていると思います。詳しい使い方は調べてみてください。

プロフィールを上書きできるような設計は、以下のようなものでどうでしょうか。 $uid1, $uid2, ... はそれぞれのユーザーに対するuidです。

root - users - $uid1 - name - icon - $uid2 - name - icon ...

投稿2018/03/23 05:50

編集2018/03/23 05:54
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sam3457

2018/03/23 07:08

回答ありがとうございます! kakajika様のおっしゃる様に、 let uid = Auth.auth().currentUser?.uid ref.child("profs").child(uid!).setValue(prof) この様にuidを取得してそれをchildByAuto()をchild(uid)にしたところ、同一ユーザーのプロフィール変更が可能になりました! ユーザーの作成したものは基本的にAuthのuidを使って各データの持ち主との紐ずけができるのですね! 自分の中でこのあといろいろ機能を追加していくにあたって、データ同士の関連ずけ(?)が心の中で引っ掛かっていたので、それを解決する足がかりにもなりそうです!ありがとうございます! 最後に一つお聞きしたいのですが、firebaseに関するこの様な知識はfirebase公式ページ、Qiitaなどで仕入れているのでしょうか?
kakajika

2018/03/23 08:09

すでにAuthは導入済みだったのですね、それはよかったです。おっしゃる通りで、uidを使うことでデータとユーザーとの関連付けを行うことができます。データへのアクセス権(例えば、SNSの投稿を作成したユーザーのみ編集を可能にする)の設定の際などにも役立ちます。 > firebaseに関するこの様な知識はfirebase公式ページ、Qiitaなどで仕入れているのでしょうか? そうですね、Firebaseに関しての情報は最近かなり増えてきていますが、だいたい公式ドキュメントか公式のblogやGitHubリポジトリで情報を得ています。Qiitaにも素晴らしい記事がたくさんありますね。
sam3457

2018/03/23 09:46

はい!なるほど、、、uid使えばいろいろなことができそうですね、、 一応公式ドキュメントを見てはいるのですが目からウロコでした笑 githubですか!githubはライブラリを導入するときくらいしか使っていなかったので、調べごたえがありそうです笑早速firebaseで検索して見ます! 最後まで質問にお付き合いして頂いて本当にありがとうございます!
guest

0

profsの下のキー名を取得してupdateChildValuesを使うようにしたらどうでしょうか?

               // キー名 ref.child("profs").child("-L8D1Db....").updateChildValues(prof)

参考記事:
https://firebase.google.com/docs/database/ios/read-and-write?hl=ja
https://qiita.com/imajoriri/items/f4080f67e08c0b529120

プロフィール情報に関しての個人的な意見ですが、DBに保存しつつ、よく使う項目はDBから情報取得時にUserDefaultsにも保存して利用すると思います。

例えば常にユーザーの名前を表示するなどの画面構成ならばusernameをUserDefaultsに持っておき、表示の際はそこから取得します。
全て必要な場合はまとめて保存しておきますが、
あまり大きすぎるとその分メモリを使いますので必要最低限のものだけにするようにします。

ぜひ他の方のご意見もお伺いしてみてください。

投稿2018/03/22 21:57

newmt

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sam3457

2018/03/23 06:52

回答ありがとうございます!いつも大変お世話になっております。 こういう方法があるのですね!キー名の取得、updateChildValues()の使用法について調べてみるとこれからの開発にもかなり使えそうでした! newmt様のおっしゃる様に、これからはよく使うデータは容量に気をつけた上でuserdefaultに保存する様にしようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問