検索

2017-12-22 20 views
0

Firebase構造検索

enter image description here

こんにちは、私は私のFirebaseデータベース(構造付属)でjobBrand & jobNameはを照会してのtableViewに保存する方法をうまくしようとしています。私は各ジョブブランドの下にもっと多くの情報を保存するつもりですので、可能であればこの方法で構造を維持したいと考えていますか?

はこれまでのところ、私は彼らが1つのレベルアップしている場合のtableViewは、2つのフィールドを読むために得ることができるので、構造は次のようになります。

tbaShootApp - >ジョブ - >ジョブブランド>データを。

私は他のレベルをクエリダウンしてtableViewに格納することはできません。これは可能ですか?私は、ジョブ情報を格納するための辞書を使用しています

class Job: NSObject { 
var id: String? 
var jobBrand: String? 
var jobName : String? 
var director : String? 
var jobInfo : jobInfo? 
init(dictionary: [String: AnyObject]) { 
    self.id = dictionary["id"] as? String 
    self.jobBrand = dictionary["jobBrand"] as? String 
    self.jobName = dictionary["jobName"] as? String 
    self.director = dictionary["Director"] as? String 
} 

}

をここでは、データを照会するためのコードである - 私は私のsuperViewDidLoadで関数「fetchJobs」を持っています。

func fetchJobs() { 

    Database.database().reference().child("Jobs").observe(.childAdded) { (snapshot) in 

     if let dictionary = snapshot.value as? [String: AnyObject] { 

       let job = Job(dictionary: dictionary) 
       job.id = snapshot.key 
       self.jobs.append(job) 

       //this will crash because of background thread, use dispatch_async to fix 
       DispatchQueue.main.async(execute: { 
        self.tableView.reloadData() 
       }) 
      } 
     } 
    } 

JSON

{ 
    "Jobs" : { 
    "Candycrush" : { 
     "cameraInfo" : { 
     "cameraBody" : "A", 
     "cameraBrand" : "Arri", 
     "cameraType" : "Alexa" 
     }, 
     "jobInfo" : { 
     "jobBrand" : "CandyCrush", 
     "jobName" : "Winter" 
     } 
    }, 
    "Honda" : { 
     "cameraInfo" : { 
     "cameraBody" : "A", 
     "cameraBrand" : "Arri", 
     "cameraType" : "Alexa XT" 
     }, 
     "jobBrand" : "Honda", 
     "jobName" : "Comet" 
    }, 
    "WWF" : { 
     "cameraInfo" : { 
     "cameraBody" : "A", 
     "cameraBrand" : "Red", 
     "cameraType" : "Epic" 
     }, 
     "jobInfo" : { 
     "jobBrand" : "WWF", 
     "jobName" : "Eye" 
     } 
    } 
    } 
} 
+0

私は正しい子を見下すように私の辞書の設定を変更する必要があると思うが、それは合計推測ですか?それが正しい場合は、私はそれが何であるべきかわからない? – spoax

+0

下位レベルを読むには: 'Database.database()。reference()。child(" Jobs/Job Brand ")。observe(.childAdded)' –

+0

ありがとうございましたFrank van Puffelenですが、 "Job Brand"ユーザーと作成された各「職場ブランド」の名前が異なります。だから私は毎回何が呼ばれているのか分からない。そのレベルをバイパスする方法や、存在するすべての "jobInfo"フォルダだけを探す方法はありますか? – spoax

答えて

0

UPDATE

あなたは、私は私の答えを掲載するので、より多くの情報を追加しているので。今すぐもっと深く問い合わせたいことは明らかです。さらに、実際のJSONを投稿してから、JobBrandノードが動的であることが明らかになりました。未知の子供の1つ下のレベルを照会することができます。あなたはそれについてhereを読むことができます。

.observe(.childAdded).observeSingleEvent(of: .value)に変更しようとしています。あなたがそのノードを観察したいと思っているほど深く質問しているので、私は間違っている可能性があります。これを変更すると、データが1回だけプルされます。その値を更新する場合は、再度照会する必要があります。

あなたはこのようなクエリたい:あなたは、現在のクエリがジョブの下にすべてのデータを返すために起こっている

Database.database().reference().child("Jobs").queryOrdered(b‌​yChild: "jobInfo/jobBrand").queryEqual(toValue: "JobBrandYouWant").observeSingleEvent(of: .value, with: { snapshot in 
    if let dictionary = snapshot.value as? [String: AnyObject] { 
     let job = Job(dictionary: dictionary) 
     job.id = snapshot.key 
     self.jobs.append(job) 
    } 
}) 

ORIGINAL ANSWER

を。ジョブブランド - > jobinfo - >などのノードが含まれます。

データ量を減らそうとするなら、JobBrand、jobinfo、またはその両方を知る必要があります。しかし、私はすべての仕事とあなたの質問がうまくいかないと思っています。

辞書にはジョブだけでなく「ジョブ」のすべてが含まれているため、現在のクエリが失敗します。 initを呼び出す前に、データスナップショットをループし、 それぞれのジョブを取得したいとします。

Database.database().reference().child("Jobs").observe(.childAdded, with: { snapshot in 
    for child in snapshot.children { // over over the snapshot and cast each "job" to it's own dictionary 
     let child = child as? DataSnapshot 
     if let key = child?.key { 
      if let dictionary = child?.value as? [String: AnyObject] { 
       let job = Job(dictionary: dictionary) 
       job.id = key 
       self.jobs.append(job) 
      } 
     } 
    } 
}) 

The documentation

.child("Jobs").observe(.childAdded) 

それはあなたがするたびにaをお知らせします、スナップショット

_commentsRef.observe(.value) { snapshot in 
    for child in snapshot.children { 
    ... 
    } 
} 
+0

私に戻ってくれてありがとう。私はアプリケーションのこのレベルで、私は仕事と仕事のjobNameを見つけることを望むと思う。それからあなたはそれぞれの仕事に入ると、さらに多くの情報、添付ファイルなどがあります。このテーブルビューのためだけに別の辞書を設定する価値はありますか? – spoax

+0

トップレベルの各ジョブBrandには、その下にjobInfoノードがありますので、ジョブのBrandノードがわからない場合は、jobInfoノードを照会する方法がありますか? – spoax

+0

はい、できます。この質問はhttps:// stackoverflowを見てください。com/questions/40713137/querying-below-autoids-in-firebase – DoesData

1

そこには長い道のりだが、多分これが役立つをループのために、この例を提供します新しいジョブが追加されました(Candycrush、Hondaなど)。

(注 - 。離れて何か他のものから、あなたは可能性が非常に高いもまた、そのリスト上の削除を観察したい)

あなたはテーブル(または何...のいくつかの並べ替えを行っている場合リスト、ページングの事、タブなど)のコレクション....

はほぼ確実各行テーブルのは、それ自身で、そのジョブを観察することになるでしょう。

だから、最初の行は、だから、第二列Jobs/Candycrush

の変化を観察するでしょう、そうでJobs/Honda

の変化を観察します。各テーブルの行(または画面、パネル、バブル、タ​​ブ、またはそれが何であれ)はであり、それ自体はです。

この一般的なガイダンスが役立ちますようにお願いします。

ちょうどBTWは確かに(あなたがホンダ、Candycrushなどを持っている) "最初のレベル"のヘッダーはID文字列になります。 (ちょうどUUIDを使うか、Firebaseにそれをさせてください)そして、フィールド "Title"はHondaなどになります。実際のタイトルをIDの種類として使うことは非常に珍しいでしょう。 (ただし、他のものとは別に、タイトルを変更/編集することはできません!)Seasons greetings。