#6 - 資料庫存取 - Core data(本機)、CloudKit/Firebase(雲端)

Excel成功匯入firebase步驟:
1.先將excel中從網路上載下來的資料(各種不同編碼格式)複製貼到記事本再貼回excel欄位,把隔式洗成big5/unicode編碼(txt檔要先存檔指定格式)
2.把處理好的excel檔貼到https://codebeautify.org/excel-to-json  轉成json格式(注意如有","符號需拿掉,不然會造成轉換格式錯誤)
3.把json資料用複製方式貼到notepad++,另存新檔(所有檔案,檔名 XXX.json)
4.之後再把notepad++存好的json檔匯入到firebase中即可



Firebase
主要分成三種資料存取方式
-Auth(授權):存放登入授權方式的資料,含email、FB、Gooel等方式
-Database(資料):存放文字相關的資料,以JSON的方式儲存(No-SQL)
-Storage(儲存):存放照片、影片、音樂等影音檔資料(以二進位方式儲存)

記得在Firebase後臺設定時要把資料庫存取權限開啟才不會遇到無法讀寫的狀況
(Database->規則->false改成true)

一般需要透過授權登入的方式後才能存取資料庫資料

AppDelegate.swift檔中須import Firebase,並輸入FirebaseApp.configure()




登入頁面swift檔
import UIKit
import Firebase
import FirebaseAuth

class SignUpViewController: UIViewController {
@IBOutlet weak var emailTextField: UITextField!
    
    @IBOutlet var passwordTextField: UITextField!
    
    @IBAction func loginbutton(_ sender: Any) {
        if self.emailTextField.text == "" || self.passwordTextField.text == "" {
            //self.showMsg("請輸入email和密碼")
            return
        }
        
        Auth.auth().signIn(withEmail: self.emailTextField.text!, password: self.passwordTextField.text!) { (user, error) in
            
            // 登入失敗
            if error != nil {
                //self.showMsg((error?.localizedDescription)!)
                return
            }
            
            // 登入成功並顯示已登入
            //self.showMsg("登入成功")
        }
    
    }
    @IBAction func creatAccountAction(_ sender: Any) {
        if emailTextField.text == "" {
            let alertController = UIAlertController(title: "Error", message: "Please enter your email and password", preferredStyle: .alert)
            
            let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
            alertController.addAction(defaultAction)
            
            present(alertController, animated: true, completion: nil)
            
        } else {
            Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (user, error) in
                
                if error == nil {
                    print("You have successfully signed up")
                    //Goes to the Setup page which lets the user take a photo for their profile picture and also chose a username
                    //註冊後跳到指定頁面
                    let vc = self.storyboard?.instantiateViewController(withIdentifier: "page")
                    self.present(vc!, animated: true, completion: nil)
                    //
                    
                    
                } else {
                    let alertController = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
                    
                    let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
                    alertController.addAction(defaultAction)
                    
                    self.present(alertController, animated: true, completion: nil)
                }
            }
        }
        
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */


}


讀寫資料頁面swift檔
   override func viewDidLoad() {
        super.viewDidLoad()
        
        /*--------Firebase新增資料設定------*/
       
        let reference: DatabaseReference! = Database.database().reference().child("EATWHAT")
        
        // 新增節點資料
        var EATWHAT: [String : AnyObject] = [String : AnyObject]()
        EATWHAT["formatted_address"] = "台北市" as AnyObject
        EATWHAT["formatted_phone_number"] = "02 28825888" as AnyObject
        EATWHAT["name"] = "全家就是你家" as AnyObject
        EATWHAT["price_level"] = "10" as AnyObject
        EATWHAT["rating"] = "5.0" as AnyObject
        EATWHAT["url"] = "http://" as AnyObject
        EATWHAT["vicinity"] = "中山區" as AnyObject
        EATWHAT["website"] = "http://" as AnyObject
        
        //let childRef = reference.childByAutoId() // 隨機生成的節點唯一識別碼,用來當儲存時的key值
         //     let EATWHATReference = reference.child(childRef.key)
        
        //設定新資料的識別碼(在資料庫中的title)
        let childRef = "150"
        let EATWHATReference = reference.child(childRef)
        
        EATWHATReference.updateChildValues(EATWHAT) { (err, ref) in
            if err != nil{
                print("err: \(err!)")
                return
            }
            
            print(ref.description())
            
              /*--------Firebase新增資料設定------*/
      
            /*--------- Firebase查詢節點資料------*/
            Database.database().reference().child("EATWHAT").observe(.childAdded, with: {
                (snapshot) in
                // childAdded逐筆呈現
                if let dictionaryData = snapshot.value as? [String: AnyObject]{
                    print(dictionaryData)
                    print(snapshot.key)
                }
                
            }, withCancel: nil)
            

            /*---------Firebase查詢節點資料------*/
        
          /*---------Firebase刪除節點資料------*/
          //指定刪除child為149的資料
            Database.database().reference().child("EATWHAT").child("149").removeValue { (error, ref) in
                if error != nil{
                    print(error!)
                    return
                }
                
                print("remove data success...")
            }
            

            /*---------Firebase刪除節點資料------*/

        // Do any additional setup after loading the view.
    }

    

Firebase資料匯入注意!
-只能餵JSON檔,對於key跟value值有嚴格規範,編碼錯誤就餵不進去,所以如果用excel轉json在餵進去很容易有錯誤發生(尤其是從網路上直接複製資料貼在excel中)



參考資料

【iOS - 利用 Firebase Authentication 來實現註冊帳號和登入的功能】

https://medium.com/@mikru168/ios-%E5%88%A9%E7%94%A8firebase%E4%BE%86%E5%AF%A6%E7%8F%BE%E8%A8%BB%E5%86%8A%E5%B8%B3%E8%99%9F%E5%92%8C%E7%99%BB%E5%85%A5%E7%9A%84%E5%8A%9F%E8%83%BD-84a62768520f

【iOS - 結合Firebase的Authentication和Database服務來達成登入+留言的功能】

https://medium.com/@mikru168/ios-%E7%B5%90%E5%90%88google-firebase%E7%9A%84authentication%E5%92%8Cdatabase%E6%9C%8D%E5%8B%99%E4%BE%86%E9%81%94%E6%88%90%E7%99%BB%E5%85%A5-%E7%95%99%E8%A8%80%E7%9A%84%E5%8A%9F%E8%83%BD-27ba4cad2034

留言