Archive/잡동사니

iOS firebase CRUD 기초 및 유의사항

lgvv 2021. 5. 1. 02:09

iOS firebase CRUD 기초 및 유의사항

파이어베이스를 공부하고 CRUD를 활용해서 작업해보자

RealtimeDatabase랑 FireStore가 존재하는데, 서비스 형태에 따라서 적절하게 적용

 

스토리보드 - View 1개

//
//  ViewController.swift
//  FirebaseDemoApp
//
//  Created by Hamlit Jason on 2021/04/30.
//

import UIKit
import Firebase

class ViewController: UIViewController {

    var ref: DatabaseReference!

    @IBOutlet weak var label: UILabel!
    
    var todos = [String]()
    var todos2 = [String:String]()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func didTapWriteButton(_ sender: Any) {
        let alertController = UIAlertController(
            title: "추가",
            message: nil,
            preferredStyle: .alert
        )
        alertController.addTextField()
        
        let okAction = UIAlertAction(title: "ok", style: .default) { (action : UIAlertAction) in
            if let newTodo = alertController.textFields?[0].text {
                // 1. 나의 데이터베이스 주소
                self.ref = Database.database().reference()
                
                self.todos.append(newTodo)
                self.todos2 = ["lgvv": newTodo]
                
                let itemRef = self.ref.child("list")
                itemRef.setValue(self.todos)

                self.ref.child("users/lgvv/username").setValue(self.todos2)
            }
        }
        alertController.addAction(okAction)
        present(alertController, animated: true)
    }
    
    @IBAction func didTapReadButton(_ sender: Any) {
        self.ref = Database.database().reference()
        
        ref.child("users/lgvv/username").observeSingleEvent(of: .value) { (DataSnapshot) in
            let value = DataSnapshot.value as? NSDictionary
            let username = value?["lgvv"] as? NSString ?? ""
        }
        
        let userRef = ref.child("users")
        
        userRef.observe(DataEventType.value, with: { (snapshot) in
            // 옵저빙 된 스냅샷 데이터
            let postDict = snapshot.value as? [String : AnyObject] ?? [:]
        })
        
    }
    
    @IBAction func didTapUpdateButton(_ sender: Any) {
        self.ref = Database.database().reference()
        
        guard let key = ref.child("list").childByAutoId().key else { return }
        
        let alertController = UIAlertController(title: "추가", message: nil, preferredStyle: .alert)
        
        alertController.addTextField()
        
        let okAction = UIAlertAction(title: "ok", style: .default) { (action : UIAlertAction) in
            if let newTodo = dialog.textFields?[0].text {
                // 내 데이터베이스의 주소를 넣어준다.
                self.ref = Database.database().reference()
                
                self.todos.append(newTodo)
                self.todos2 = ["lgvv":newTodo]
                
                let childUpdates = ["/list/": self.todos]
                let childUpdates2 = ["/users/": self.todos2]

         
                self.ref.updateChildValues(childUpdates)
                self.ref.updateChildValues(childUpdates2)
            }
        }
        
        alertController.addAction(okAction)
        present(alertController, animated: true)
    }
    
    @IBAction func didTapDeleteButton(_ sender: Any) {
        self.ref = Database.database().reference()
        
        let alertController = UIAlertController(title: "삭제", message: nil, preferredStyle: .alert)
        
        alertController.addTextField()
        
        let okAction = UIAlertAction(title: "ok", style: .default) { (action : UIAlertAction) in
            if let newTodo = dialog.textFields?[0].text {
                // 내 데이터베이스의 주소를 넣어준다.
                self.ref = Database.database().reference()
                
                self.todos.append(newTodo)
                self.todos2 = ["lgvv":newTodo]
                
                self.ref.child("users").removeValue { (_: Error?, DatabaseReference) in
                    // 삭제 처리에 대한 값이 떨어지는 클로저
                }
            }
        }
        
        alertController.addAction(okAction)
        present(alertController, animated: true)
    }
}




유의점

  • GoogleService-Info.plist 파일 이름이 정확히 일치해야 함
    • 프로젝트 안에 넣을 때 Ref를 참조하는게 아니라 Copy해야 Xcode안에서 해당 파일에 세팅된 옵션을 파이어베이스 프레임워크가 읽어서 처리함

GoogleService-Info 파일 연결의 주의점