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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

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

Swift

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

Q&A

解決済

1回答

365閲覧

Firebase Storageのデータ構造について

sam3457

総合スコア52

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/03/30 12:00

Firebase Auth・Storage・RealtimeDatabaseを使用した、名前とアイコンとともに画像を一枚だけ投稿するSNSアプリを作っています。
以下は投稿作成画面と投稿ボタンをタップした際に呼ばれるコードです。
イメージ説明

swift

1 @IBAction func post(_ sender: Any) { 2 3 //セットした画像をエンコード 4 var data: Data = Data() 5 if let image = iconImageView.image { 6 data = UIImageJPEGRepresentation(image, 0.1)! as Data 7 } 8 9 10 //firebaseにpostを送る 11 let uid = Auth.auth().currentUser?.uid 12 13 let storageRef = Storage.storage().reference() 14 storageRef.child("posts").child(uid!).putData(data, metadata: nil) { metadata, error in 15 if error != nil { 16 17 } else { 18 19 let downloadURL = metadata!.downloadURL() 20 21 let url = String(describing: downloadURL) 22 let RDBref = Database.database().reference() 23 let post: Dictionary = ["postimage": url] 24 RDBref.child("posts").child(uid!).childByAutoId().setValue(post) 25 26 } 27 } 28 29 30 KRProgressHUD.showSuccess(withMessage: "送信しました") 31 32 //画面を閉じる 33 self.dismiss(animated: true, completion: nil) 34 }

Storageに画像をアップロードし、そのダウンロードURLをRealtimeDatabaseに参照として保存しています。

以上の様なアップロードの仕方だと、投稿画像が既存の画像に上書きされてしまい、複数のデータとして保存できませんでした。
イメージ説明

プロフィール情報はこの様に1ユーザーに一つなので問題ないのですが、投稿データは1ユーザーにつき複数持てる(複数回の投稿が上書きではなくそれぞれ保存される)様にしたいです。

RealtimedatabaseではchildByAutoId()で上書きされない様な形を取れると思うのですが、Storageでその様に複数データとして保存していきたい場合はどう記述すれば良いのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

StorageのAPIではIDの自動生成ができないので、RDB側で生成したIDを使って同じような構成にすればOKです。

swift

1// 先にRDBのrefを生成して、IDをStorageのref生成に使う 2let RDBref = Database.database().reference() 3let newPostRef = RDBref.child("posts").child(uid!).childByAutoId() 4let newPostID = newPostRef.key 5 6let storageRef = Storage.storage().reference() 7storageRef.child("posts").child(uid!).child(newPostID).putData(data, metadata: nil) { metadata, error in 8 ... 9 10 let downloadURL = metadata!.downloadURL() 11 let url = String(describing: downloadURL) 12 let post: Dictionary = ["postimage": url] 13 newPostRef.setValue(post) 14 15 ... 16}

投稿2018/03/30 12:48

kakajika

総合スコア3131

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

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

sam3457

2018/03/31 02:23

回答ありがとうございます。いるもお世話になっております。 .keyはこの様に使うのですね、、!お教えいただいた方法で色々なことに応用ができそうです! ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問