2016-06-19 4 views
4

Firebaseを初めて使用していますが、プロバイダの写真URLを保存したいのですが、「NSNumber、NSString、NSDictionary、とNSArray。私は方法の異なる種類を試してみましたが、それはそれは私の方法Firebaseストアプロバイダの写真URL(NSURLタイプの値を変換できません)

func createFirebaseUser(){ 

     let key = ref.child("user").childByAutoId().key 
     if let user = FIRAuth.auth()?.currentUser{ 
      for profile in user.providerData{ 
       let uid = profile.uid 
       let providerID = profile.providerID 
       let displayName = profile.displayName 
       let email = "" 
       let profilePicUrl = profile.photoURL 


       //let userDict :[String : AnyObject] = ["name": username!"profilePicUrl": profilePicUrl!] 
      let profile = Profile(uid: uid, displayName: displayName!,email: email, imageUrl: profilePicUrl) 

       let childUpdates = ["/user/\(key)": profile] 


       ref.updateChildValues(childUpdates, withCompletionBlock: { (error, ref) -> Void in 
        // now users exist in the database 
        print("user stored in firebase") 
       }) 
      } 
     } 

ある例let profilePicUrl = profile.photoURL as Stringまたはlet profilePicUrl = NSString(NSURL: profile.photoURL)

のために働いていないようで、それはあなたがすべき本当にデータモデル

import Foundation 

class Profile { 

private var _uid: String 
private var _displayName: String 
private var _email: String? 
private var _gender: String! 
private var _city: String! 
private var _imageUrl: String! 

var uid: String { 
    return _uid 
} 

var displayName: String { 
    get { 
     return _displayName 
    } 

    set { 
     _displayName = newValue 
    } 
} 

var email: String { 
    get { 
     return _email! 
    } 

    set { 
     _email = newValue 
    } 
} 

var gender: String { 
    get { 
     return _gender 
    } 

    set { 
     _gender = newValue 
    } 
} 

var city: String { 
    get { 
     return _city 
    } 

    set { 
     _city = newValue 
    } 
} 

var imageUrl: String { 
    get { 
     return _imageUrl 
    } 

    set { 
     _imageUrl = newValue 
    } 
} 

init(uid: String, displayName: String, email: String, imageUrl: String) { 
    _uid = uid 
    _displayName = displayName 
    _email = email 
    _imageUrl = imageUrl 

} 

答えて

4

Firebaseで述べた4種類のNSObjectしか保存できません。しかし、ほとんどの場合、データは単なる文字列であり、文字列を格納するのは簡単です。

あなたphotoURLは、実際のNSURLがあると仮定すると、あなたはそれを文字列として保存することができますすることは

let ref = myRootRef.childByAppendingPath("photo_urls") 
let thisFileRef = ref.childByAutoId() 
thisFileRef.setValue(photoURL.absoluteString) 

let url = NSURL(string: urlString)! 

またNSURLに文字列から行くには、それはあなたの作成し表示されますFirebaseの新しいユーザ。あなたは非常に私はあなたが本当にコードの量を減らし、きれいに保ち

let aUser = User() 
aUser.initWithStuff(displayName, email, gender etc etc 
aUser.createUser() 

をできるように、Userクラスのコードの一部を行うことを示唆している。この

let usersRef = self.myRootRef.childByAppendingPath("users") 
let thisUserRef = usersRef.childByAutoId() 

var dict = [String: String]() 
dict["displayName"] = "Bill" 
dict["email"] = "[email protected]" 
dict["gender"] = "male" 
dict["photo_url"] = photoURL.absoluteString 

thisUserRef.setValue(dict) 

のようなコードを簡素化することができます。

ユーザーを格納する場合は、各ユーザーノードのキーとしてauth.uidを使用する必要があります。これは2.xよりもv3.xのほうが難しいですが、Firebaseにすぐに修正が加えられることを願っています。

+0

私の質問にお答えいただきありがとうございます。 'FIRAuth.auth()。currentuser'からデータを取得したい場合。特定のデータではなく、データ辞書を 'provider.email'などに変更する必要がありますか? –

+0

私はその質問を理解していませんが、currentUserには一意のID、プライマリ電子メールアドレス、名前、写真のURLがあります。したがって、電子メールを照会する必要がある場合は、それ以外の場合は検索できないため、/ users/uidノードに格納することもできます。だから私の例では、それは単なる一般的な電子メールのプレースホルダだったかもしれません。おそらく2番目のメールですが、あなたが望むもの – Jay

1

ですデータへの相対パスをFirebaseデータベースに格納し、絶対URLの接頭辞を別々に(Firebaseの他のノードや他の場所に)保存することです。これにより、柔軟性があり、多くの心配なしに別のストレージに切り替えることができます。さらに、現在の問題を解決する必要があります。これは、生の文字列をFirebaseに格納してからアプリケーションに格納するため、完全なURLを生成するために接頭辞と相対パスをマージします。

http://storage.example.com/photos/photo1.jpg

その後、あなたにこのURLを分解することができます:

prefix = http://storage.example.com/ 
relativeUrl = photos/photo1.jpg 

例えば接頭辞を保存たとえば

、さんが写真にあなたのURLがそのようになっていることを想定してみましょうFirebaseデータベース内のいくつかの設定ノードで、写真のデータ内のrelativeUrlを使用します。

次に完全なURLを構築するには、それらを連結したいと思う。

+0

写真は 'provider.photoURL'からのものです。つまり、ログインプロバイダからURLを取得する方法です。私はあなたの答えからどうすればいいですか? –

関連する問題