2017-02-17 6 views
0

и спасибо за помощь!firebase Databse Query Swift не читает

Каждый пользователь моего приложения ответит на ряд вопросов. Я успешно написал эти ответы на мою базу данных (да ну мне!) В следующей структуре (см прилагаемого рис слишком link to database structure): Структура База данных:

 - driverQuestions 
      - 'userId' (this the UID generated at authentication) 
      - answers (this is the answer that I need to display in the users profile for future reference 
      - questions (this is the question that the user has answered) 

База данных Правил:

{ 
    "rules": { 
    "driverQuestions": { 
     "$userId": { 
     ".indexOn": "answers" 
     } 
    }, 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

Я попытался запросить мою базу данных с помощью этого кода:

import FirebaseDatabase 
import Firebase 
import FirebaseAuth 

let userId = FIRAuth.auth()?.currentUser?.uid 
var ref: FIRDatabaseReference! 

ref?.child("driverQuestions").child(userId!).child("answers").queryOrdered(byChild: "answers").queryEqual(toValue: userId).observe(.value, with: { (snapshot) in 
      let postDict = snapshot.value as? [String : AnyObject] ?? [:] 
       print(postDict) 

В моем консуле я ничего не печатаю. Я думаю, что проблема в том, что userId уникален, но я не уверен, что с этим делать ... Можете ли вы, пожалуйста, сообщить мне, что я делаю неправильно, и что мне нужно сделать, чтобы иметь возможность хранить ответы из базы данных для зарегистрированного пользователя

Позвольте мне знать, если вам потребуется дополнительные разъяснения

Еще раз спасибо за ваше время и помочь

ответ

0

Проблема заключается в том, что вы запрашиваете узел ответил вместо пользователь, для дочерних узлов с ключевыми «ответами», которые по вашему сообщению, похоже, не существуют, если у вас нет дополнительных вложенных узлов в ваших ответах JSON. В противном случае, пожалуйста, обновите свою полную структуру данных и сообщите мне. Итак, вы смотрите в драйвереQuestions/userId/ответы/ответы вместо driverQuestions/userId/answers

Удаленный пример кода, это не имело значения.

Попробуйте это, чтобы получить все данные для пользователя, напечатанного в консоли:

FIRDatabase.database().reference().child("driverQuestions").child(userId!).observe(.value, with: {snapshot in 
    let answersData = snapshot.value as? [String:Any] ?? [:] 
    print(answersData) 
}) 
+0

спасибо, что нашли время, чтобы прочитать мой пост! Отличное объяснение, и это имеет смысл ... к сожалению, ничего не печатается в консуле! Любые другие предложения ??? Вы уверены, что мой код, относящийся к userId, верен? любые другие рекомендации, как обращаться с уникальными идентификаторами? – theGuiza

+0

Способ работы с структурированными данными будет работать. Узел вопросов драйвера, случайный ключ UID и данные для этого узла. Я обновил свой ответ, чтобы получить все пользовательские данные, а не только данные в узле ответов прошедшего пользователя. Возможно, у UID, который вы проходили, не было данных ответа, которые ничего не печатали. – matthew

+0

Эй, это была проблема, которую я раньше не видел: var ref: FIRDatabaseReference! Если вы хотите создать корневую ссылку, лучший способ сделать это - разрешить rootRef = FIRDatabase.database(). Reference() – matthew