Json parsing into swift 3 currency exchange values from bank accounts - swift

Is it possible to fetch currency exchange rates from some banks websites in my country, and is it legal ?
making an app specified to my country and have been trying for a week now but couldn't find an answer this is the code could you tell a solution?
import UIKit
class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {
#IBOutlet weak var lblDisplay: UILabel!
#IBOutlet weak var txtField: UITextField!
#IBOutlet weak var pkrView: UIPickerView!
var myCurrency:[String] = []
var myValue:[Double] = []
var activeCurrency:Double = 0
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "http://ca-egypt.com")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error)in
if error != nil{
print("error is here!")
}else{
if let content = data{
do{
let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
if let rates = myJson["rates"] as? NSDictionary{
var firstOne = true
for (key,value)in rates{
self.myCurrency.append((key as? String)!)
self.myValue.append((value as? Double)!)
}
}
}catch{
}
}
}
self.pkrView.reloadAllComponents()
}
task.resume()
}
#IBAction func btnCalculateAction(_ sender: UIButton) {
lblDisplay.text = String(Double(txtField.text!)! * activeCurrency)
}
func numberOfComponents(in pickerView: UIPickerView,umberOfRowsInComponent component: Int) -> Int {
return myCurrency.count
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return myCurrency.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return myCurrency[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
activeCurrency = myValue[row]
}
}
Image of the Error:

Hello #Ali instead of fetching currency exchange rates from some banks websites, you can make use of some API, which are freely available or you can make use of paid API's. And off-course fetching currency exchange rates is illegal. They won't allow some-one to get values.
To get various countries currency-exchange rates use Fixer.io , which are updating on daily basis, and yes it is freely available.
Fixer.io is a free JSON API for current and historical foreign exchange rates, published by the European Central Bank. The rates are updated daily around 4PM CET.
Example :
API Link : http://api.fixer.io/latest?base=USD
Alamofire.request("http://api.fixer.io/latest?base=USD") .responseJSON { response in
if let arr = response.result.value as? [String:AnyObject]
{
let usd_val = (arr["rates"]?["INR"] as? NSNumber)!
print(usd_val)
}
}
By this way you can parse JSON API and use this currency exchange values, and if you want to get your country currency exchange value, then pass value.
example : To get current currency exchange value of Japan, then pass value of it. Like this. http://api.fixer.io/latest?base=JPY
Hope it helps you.

Related

Swift - Passing data from model to controller using delegate design pattern

i am a swift learner, and need assistance in passing data
Here i have ViewController and CoinManager model. What i am trying to do is call didUpdatePrice method that's declared inside my ViewController from CoinManager, this function is responsible to update the UI. I have implemented CoinManagerDelegate protocol in ViewController, but every time i am trying to call didUpdatePrice method it throws an error like this:
Type '(any CoinManagerDelegate)?' has no member 'didUpdatePrice'
When i tried to declare delegate in my ViewController like this:
coinManager.delegate = self
it also returns an error like this:
Cannot assign value of type 'ViewController' to type '(any
CoinManagerDelegate)?.Type'
Here's my ViewController code:
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, CoinManagerDelegate {
var coinManager = CoinManager()
override func viewDidLoad() {
super.viewDidLoad()
coinManager.delegate = self
currencyPicker.dataSource = self
currencyPicker.delegate = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return coinManager.currencyArray.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return coinManager.currencyArray[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let selectedCurrency = coinManager.currencyArray[row]
coinManager.getCoinPrice(for: selectedCurrency)
}
#IBOutlet weak var currencyPicker: UIPickerView!
#IBOutlet weak var currencyLabel: UILabel!
#IBOutlet weak var bitcoinLabel: UILabel!
func didUpdatePrice(price: String, currency: String) {
DispatchQueue.main.async {
self.bitcoinLabel.text = price
self.currencyLabel.text = currency
}
}
}
And here's my CoinManager model code:
import Foundation
protocol CoinManagerDelegate: NSObjectProtocol {
func didUpdatePrice(price: String, currency: String)
}
struct CoinManager {
var delegate = CoinManagerDelegate?.self
let baseURL = "https://rest.coinapi.io/v1/exchangerate/BTC"
let apiKey = "#API_KEY"
let currencyArray = ["AUD", "BRL","CAD","CNY","EUR","GBP","HKD","IDR","ILS","INR","JPY","MXN","NOK","NZD","PLN","RON","RUB","SEK","SGD","USD","ZAR"]
func getCoinPrice(for currency: String){
let urlString = "\(baseURL)/\(currency)?apikey=\(apiKey)"
if let url = URL(string: urlString) {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
if error != nil {
print("error")
}
if let safeData = data {
let data = parseJSON(safeData)
let dataString = String(format: "%.2f", data!)
self.delegate.didUpdatePrice(price: dataString, currency: currency)
}
}
task.resume()
}
}
func parseJSON(_ data: Data) -> Double? {
let decoder = JSONDecoder()
do{
let decodedData = try decoder.decode(CoinData.self, from: data)
let lastPrice = decodedData.rate
return lastPrice
} catch {
return nil
}
}
}
Any help is much appreciated!
On the internet, this method should works fine. But it didn't work on my machine.
I've tried to surf the internet and implemented their answers, but it didn't help me, i tried to ask chatGPT as well but the result is nil TwT. Thanks a lot fellow coders!
change the following in your code this should work at your end
in ViewController change coinManager.delegate = ViewController to coinManager.delegate = self
and in CoinManager update the following
var delegate = CoinManagerDelegate?.self
to
var delegate : CoinManagerDelegate?
on call back with delegate first make sure delegate connection is successfully connect
if let del = self.delegate
{
del.didUpdatePrice(price: dataString, currency: currency)
}

Populating UIPickerview values from CoreData in Swift

I am trying to populate a UIPicker with data that is stored in coreData. they way i have gone about this is i have set up a global variable array and when the screen loads a fetch request is sent to core data which populates the global array. The UIPicker then reads this global array and populates itself with its array of strings.
the problem is that the UIPicker populates fine the first time i load it, but then the second time i get the original entries repeated, and the 3rd time and 4th etc...
global array:
var savedWorkoutNamesPulled = [String]()
UIPicker set up:
//needed picker function (number of columns in picker view)
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
//needed picker function (number of rows in pickr view)
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
savedWorkoutNamesPulled.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
//setting exercisesInSelectedWorkout(exercise names within workout) to the elements of the uipicker
let row = savedWorkoutNamesPulled[row]
return row
}
Calling coredata function:
override func viewDidAppear(_ animated: Bool) {
//calling function that deals show picker
showUiPicker()
//going into core data swift file and calling a function (this function sets global array to fill workout names into picker view)
print("your workouts are as follows")
CoreDataManager.sharedInstance.retrieveWorkoutDataFromCoreData()
}
The core data function that appends values to global array:
func retrieveWorkoutDataFromCoreData() -> [Contact]{
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ContactsData")
let result = try? context.fetch(fetchRequest)
var contacts = [Contact]()
for data in result as! [NSManagedObject]{
guard let id = data.value(forKey: "id") as? String else {continue}
guard let fullName = data.value(forKey: "fullName") as? String else {continue}
guard let excercise = data.value(forKey: "excersizes") as? [Exercise] else {continue}
var contact = Contact(id: id, fullname: fullName, exercises: excercise)
contact.id = id
contacts.append(contact)
print(fullName)
print(id)
savedWorkoutNamesPulled.append(fullName)
}
return contacts
}
I was able to fix it by just by setting the array to nothing when the view was dismissed.
override func viewDidDisappear(_ animated: Bool) {
savedWorkoutNamesPulled = []
}

How can I get value of a Dictionary item from first item of an Array in Swift?

I have defined Dictionary in an Array object below:
var dataList : [[String:Any]]?
And then I have loaded some data in to it. Here is the output when i run this code below:
print("DATA LIST:\n \(myRecordList)")
Output:
Optional([["itemCode": 0, "itemText": please select city], ["itemCode": 1, "itemText": City A], ["itemCode": 2, "itemText": City B], ["itemCode": 3, "itemText": City C], ["itemCode": 4, "itemText": City D], ["itemCode": 5, "itemText": City E], ["itemCode": 6, "itemText": City F]])
I would like to reach value of a dictionary from first item in an Array:
As you know, here is the first item in an array:
["itemCode": 0, "itemText": please select city]
And here is the value in above dictionary:
"itemText": please select city
After that I would like to set above text ("please select city") as a button title if dataList count is not zero:
if dataList?.count != 0
{
**//need help in here!!!**
{
self.btnSelectMarkaOutlet.setTitle(tempBtnTitle, for: .normal)
}
}
I have tried below scope. But it crushed:
if let newTry = dataList![0]["itemText"] as? [String]
{
print("here is the output:: \(newTry[0])")
}
Here is the error:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
let tempBtnTitle = must be "please select city"
I wanted to do this.
Let me share whole view controller file. Because dataList is nil.
import UIKit
class SinyalSeviyesineGoreAramaYapViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
#IBOutlet weak var btnSelectMarkaOutlet: UIButton!
#IBOutlet weak var pickerViewOutlet: UIPickerView!
var dataList : [[String:Any]]?
override func viewDidLoad() {
print("viewDidLoad")
super.viewDidLoad()
self.pickerViewOutlet.delegate = self
self.pickerViewOutlet.dataSource = self
self.loadSayacRecordsForTheUIPickerView()
print("Is the data list nil? : \(self.dataList)")
if let newTry = self.dataList![0]["itemText"] as? String
{
print("here is the output:: \(newTry)")
}
//I WANTED TO SET BUTTON TITLE !!
let tempButtonTitle = ""
self.btnSelectMarkaOutlet.setTitle(tempButtonTitle, for: .normal)
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let recordName = self.dataList![row]
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
//return self.cityList![row]
let info = self.dataList![row]
if let name = info["itemCode"] as? String,
let code = info["itemText"] as? String
{
let text = "\(name) - \(code)"
//print("am i here? \(text)")
return text
}
return nil
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.dataList == nil ? 0 : self.dataList!.count
}
func loadSayacRecordsForTheUIPickerView()
{
print("loadSayacRecordsForTheUIPickerView method is called")
ServiceManager.oServiceManager.loadSayacRecords()
{
(result) in
if let sayacRecords = try? JSONSerialization.jsonObject(with: result!, options: .mutableContainers) as? [String:Any]
{
if let resultCodeFromWebApi = sayacRecords?["resultCode"] as? String
{
DispatchQueue.main.async
{
print("loadSayacRecordsForTheUIPickerView resultCode: \(resultCodeFromWebApi)")
if resultCodeFromWebApi == "999"
{
if let myRecordList = sayacRecords?["recordList"] as? [[String:Any]]
{
//DispatchQueue.main.async
//{
self.dataList = myRecordList
print("DATA LIST:\n \(self.dataList)")
self.pickerViewOutlet.reloadAllComponents()
//}
}
} // resultCodeFromWebApi == 999 ENDS
else
{
if let resultMessageFromWebApi = sayacRecords?["resultMessage"] as? String
{
print("resultMessage: \(resultMessageFromWebApi)")
}
}
} // DispatchQueue.main.async ENDS
}
else
{
print("cant parse it")
} // if let resultCodeFromWebApi = loginResult?["resultCode"] as? Int ENDS
}
}
} // loadSayacRecordsForTheUIPickerView ENDS
} // class SinyalSeviyesineGoreAramaYapViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource ENDS
The problem is in the logic you implemented: the dataList is loaded asynchronously, which means that you don't know when it will be available, but you are using it like it's always available.
Example of this error is in the viewDidLoad:
self.loadSayacRecordsForTheUIPickerView()
print("Is the data list nil? : \(self.dataList)")
if let newTry = self.dataList![0]["itemText"] as? String
{
print("here is the output:: \(newTry)")
}
With the first line you start to load the dataList, but in the for loop you are force unwrapping, which means you are saying "Ehi I'm 100% sure it will be available" - which is not true.
A possible solution for your problem is to convert the dataList! to dataList? everywhere, so if it's not loaded then nothing happens and your app won't crash.
A better and quicker solution is to have a default value for dataList, so in case is not loaded you will just react to an empty data model:
var dataList : [[String:Any]] = [[String:Any]]()
A reason would be array is nil and also you are unwrapping with [String] which is String, which may give nil.
Try below to avoid crashes.
if dataList?.isEmpty == false,let firstDic = dataList?.first, let neededString = firstDic["itemText"] as? String {
}

Assigning a different output value than what is shown on UIPickerView

I've searched all throughout yesterday on this website for an answer to this, but I haven't been able to find this. I'm an amateur coder, really just doing this for a small organization to see if we can help improve processes.
Here is what I'm trying to do. I'm trying to make an app that allows someone to select an account number, a task, and then it will output a numerical number for a full account number that they can put on receipts.
For example, someone selects account number 12345678910 and they select "cleaning the bathroom". I want the app to spit out a full account number like 12345678910 58392, where 58932 is associated with "cleaning the bathroom", but is not actually shown on the PickerView. I've been having trouble with this. Coding is something I've always wanted to learn, but have been doing it on my own time, so please forgive the amateur like mistakes if any. I've been using YouTube videos for this.
Any help is appreciated. Thanks so much!
Sample app screen-shot
import UIKit
class Account {
var account: String
var jlCode: [String]
init(account:String, jlCode:[String]) {
self.jlCode = jlCode
self.account = account
}
}
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
#IBOutlet weak var pickerView: UIPickerView!
#IBOutlet weak var accountLbl: UILabel!
var accounts = [Account]()
#IBAction func showPopup(_ sender: Any) {
let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbPopUpID") as! PopUpViewController
self.addChildViewController(popOverVC)
popOverVC.view.frame = self.view.frame
self.view.addSubview(popOverVC.view)
popOverVC.didMove(toParentViewController: self)
}
override func viewDidLoad() {
pickerView.delegate = self
pickerView.dataSource = self
//This area will have to be changed once you get the right information.
accounts.append(Account(account: "12345678910", jlCode: ["task 1", "task 2", "task 3", "task 4"]))
accounts.append(Account(account: "1112131415", jlCode: ["Task 1"]))
accounts.append(Account(account: "1617181920", jlCode: ["task 1", "task 2", "task 3", "task 4"]))
accounts.append(Account(account: "2122232425", jlCode: ["task 1", "task 2", "task 3", "task 4"]))
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 2
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return accounts.count
} else {
let selectedAccount = pickerView.selectedRow(inComponent: 0)
return accounts[selectedAccount].jlCode.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
return accounts[row].account
} else {
let selectedAccount = pickerView.selectedRow(inComponent: 0)
return accounts[selectedAccount].jlCode[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
pickerView.reloadComponent(1)
let selectedAccount = pickerView.selectedRow(inComponent: 0)
let selectedjlCode = pickerView.selectedRow(inComponent: 1)
let account = accounts[selectedAccount].account
let jlCode = accounts[selectedAccount].jlCode[selectedjlCode]
accountLbl.text = "Account Number: \(account)\nJL Code: \(jlCode)"
}
}
If, and that is a big IF, I understand you correctly your problem is that you have nothing connecting the description of the task with the numeric value associated with the task. In other words it seems your simply struggling with the modelling of your data.
I would think something like the below might help you in the right direction:
struct Account {
var number: Int
var tasks: [Task]
var description: String { return "\(number)" }
}
struct Task {
var number: Int // or JLNumber, or whatever you want to call it
var description: String
}
That would leave you setting up Accounts like this:
let account = Account(number: 12345678910, tasks: [Task(number: 58932, description: "Cleaning the bathroom")])
You would display the .description in the pickerView, and use the .number wherever that makes sense.
If the different type of tasks are predefined, (i. e. they will never change without the code being changed) you should have a look at enums rather than creating them on the fly with strings and integers...

issues loading items from firebase to a pickerview

I have successfully created a QuestionModel class which retrieves items from firebase such, as a Question, string of answers and a correct question. I am however now having difficulty in terms of getting these items to go into a picker view from another class. The class called QuestionsViewController is where I am having an issue in terms of using the questions class to retrieve data from. The QuestionModel class contains retrieving data from firebase. I am having bad execution errors throughout the code in the QuestionsViewController class. This mainly occurs when trying to set the itemlabel text before the pickverview and code for the pickerview functions.
import Foundation
import Firebase
import FirebaseDatabase
import FirebaseAuth
import CoreData
class QuestionList
{
//properties
public static var Username: String = ""
private static var quiz = [Question]()
static func getDummyQuestions()->[Question]
{
//create some dummy data for the model
var ref: FIRDatabaseReference!
var refHandle: UInt!
ref = FIRDatabase.database().reference() //reference
refHandle = ref.child("Questions").child("Q1").observe(.value, with: { (snapshot)in
if let dataDict = snapshot.value as? [String: Any] {
if let quest = dataDict["Question"] as? String,
let Answers = dataDict["Answers"] as? [String],
let Correct = dataDict["Correct"] as? Int {
quiz.append(Question(q: quest, a: Answers, c: Correct))
}
print (dataDict)
}
})
return quiz
}
}
class Question {
var quest:String
var answers:[String]
var correct:Int
init(q: String, a:[String], c:Int)
{
quest = q
answers = a
correct = c
}
func isCorrectQuestion(itemSelected: String)->Bool {
if (itemSelected == answers[correct]) {
return true
} else {
return false
}
}
}
import UIKit
import Firebase
import FirebaseAuth
class QuestionsViewController: UIViewController, UIPickerViewDelegate {
#IBOutlet weak var usernamelabel: UILabel! //sets username label
#IBOutlet weak var Next: UIButton! //next button
#IBOutlet weak var itemLabel: UILabel! //item user has selected
#IBOutlet weak var Question: UILabel! //sets question label
#IBOutlet weak var pickerview: UIPickerView! //sets picker view
public var totalQuestions: Int = 0 //sets total question to 0
public var currentQuestion = 0 //sets current question to 0
public var totalCorrect: Int = 0 //sets totalcorrect to 0
var itemSelected: String = "" //item selected
var LabelText = String()
let Exam = QuestionList() //uses the questions class for instances
var Questions = QuestionList.getDummyQuestions()
var ref: FIRDatabaseReference!
var refHandle: UInt!
override func viewDidLoad() {
super.viewDidLoad() //when the app is loaded
ref = FIRDatabase.database().reference() //reference
refHandle = ref.child("Questions").observe(.value, with: { (snapshot)in
let dataDict = snapshot.value as! [String: AnyObject]
print (dataDict)
})
usernamelabel.text = LabelText //username
pickerview.delegate = self
itemLabel.text = "" //loads the item label of whats selected
itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[0] //initially when loaded first item is selected
Question.text = QuestionList.getDummyQuestions()[currentQuestion].quest
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1 //return one component from the picker
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return QuestionList.getDummyQuestions()[currentQuestion].answers.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
return QuestionList.getDummyQuestions(). [currentQuestion].answers[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
itemSelected = QuestionList.getDummyQuestions(). [currentQuestion].answers[row]
}
#IBAction func NextAction(_ sender: Any){
currentQuestion = currentQuestion + 1 //moves onto next question and increments
if (QuestionList.getDummyQuestions()[currentQuestion].isCorrectQuestion(itemSelected: itemSelected)) {
totalCorrect += 1
itemLabel.text = String(totalCorrect) + "/" + String(totalQuestions)
}
if(currentQuestion < QuestionList.getDummyQuestions().count) {
pickerview.reloadAllComponents()
itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[1]
Question.text = QuestionList.getDummyQuestions() [currentQuestion].quest
} else {
pickerview.isHidden = true
Question.text = "You have finished"
Next.isHidden = true
}
}
}
Firebase functions do not (and should not) return values as they are asynchronous.
So the return quiz line will fail most of the time as it will try to return data before Firebase has had time to retrieve it from the server.
When coding with Firebase, data is only valid inside the closure following the function. So for example, this what NOT to do:
func someFunc() {
ref.child("Questions").child("Q1").observe(.value, with: { snapshot in
print(snap)
})
print(snap) //this will not print the snap as this line executes *before* the closure
}
So doing it the right way; retrieve the data from Firebase, populate the array and refresh the tableview all within the closure.
static func populateArrayAndRefreshTableView()
{
var ref: FIRDatabaseReference!= FIRDatabase.database().reference()
let questionsRef = ref.child("Questions")
questionsRef.child("Q1").observeSingleEvent(of: .value, with: { snapshot in
if let dataDict = snapshot.value as? [String: Any] {
let quest = dataDict["Question"] as? String,
let Answers = dataDict["Answers"] as? [String],
let Correct = dataDict["Correct"] as? Int {
self.quizArray.append(Question(q: quest, a: Answers, c: Correct))
self.tableView.reloadData()
}
})
}
}
Also note that the original code was using observe(.value). That will leave an observer attached to the ref and if the question changes, the code will be called. It doesn't look like that should be the behavior so using observeSingleEvent will call it once without adding an observer.
Finally - you may want to re-consider how the nodes are named in your structure. It's often best practice to disassociate node name keys from the data they contain.
questions
-UYiuokoksokda
question: "What significant contribution to bioengineering was made on the Loonkerian outpost on Klendth?"
correct_answer: answer_1
answers:
answer_0: "Left handed smoke shifter"
answer_1: "The universal atmospheric element compensator"
answer_2: "Warp coil nullification amplifier"
answer_3: "H.A.L. 9000"
-YY8jioijasdjd
question: "What is Kiri-kin-tha's first law of metaphysics?"
correct_answer: answer_2
answers:
answer_0: "No matter where you go, there you are"
answer_1: "Only people with sunroofs use them"
answer_2: "Nothing unreal exists"
answer_3: "Gravity is heavy"
The keys, UYiuokoksokda, are created with childByAutoId().
If you need to query answers you may want to even denormalize them into their own node and use the question key as the node key for the answers or keep a child node with the question key.