Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active September 5, 2016 20:54
Show Gist options
  • Save KentarouKanno/423732b2cb5ec9b9d0fa05839f5f1830 to your computer and use it in GitHub Desktop.
Save KentarouKanno/423732b2cb5ec9b9d0fa05839f5f1830 to your computer and use it in GitHub Desktop.
fmdb

fmdb

fmdb Sample1
fmdb Sample2

★ ViewController

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        // Create Table
        DataBaseManager.sharedInstance.createPersonalDataBase()
        
        readCSVToDataBase()
        
        // DataBase → TableView Data
        dataArray = DataBaseManager.sharedInstance.selectPersonalAllData()
        
        tableView.tableFooterView = UIView()
        tableView.estimatedRowHeight = 20
        tableView.rowHeight = UITableViewAutomaticDimension
    }
    
    func readCSVToDataBase() {
        
        // Bundle CSV → DataBase
        if let personalData = CSVManager.readBundleCSVData() {
            for  data in personalData {
                NSUserDefaults.standardUserDefaults().setBool(true, forKey: "CSVReadFlg")
                DataBaseManager.sharedInstance.insertPersonalData(data)
            }
        }
    }
    
    // Data Array
    var dataArray: [PersonalData] = []
    
    // MARK: - TableView Delegate & DataSource
    
    // Row Count
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }
    
    // Generate Cell
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
        cell.personal = dataArray[indexPath.row]
        return cell
    }
    
    // Select Cell
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        print("Cell Tap - ",indexPath.row)
    }
    
    @IBAction func resetIncrement(sender: UIBarButtonItem) {
        DataBaseManager.sharedInstance.resetAutoIncrement()
    }
    
    @IBAction func clearTable(sender: UIBarButtonItem) {
        DataBaseManager.sharedInstance.deleteAllPersonalData()
        
        readCSVToDataBase()
        dataArray = DataBaseManager.sharedInstance.selectPersonalAllData()
        tableView.reloadData()
        
    }
    @IBAction func update(sender: UIBarButtonItem) {
        
        let data = PersonalData()
        data.name = "UpdateName"
        data.age = 33
        data.address = "Hokkaido"
        DataBaseManager.sharedInstance.updatePersonalData(data, updateData: dataArray[dataArray.count - 1])
        
        
        dataArray = DataBaseManager.sharedInstance.selectPersonalAllData()
        tableView.reloadData()
    }
}

★ CustomCell

import UIKit

class CustomCell: UITableViewCell {
    
    @IBOutlet weak var nameLabel   : UILabel!
    @IBOutlet weak var ageLabel    : UILabel!
    @IBOutlet weak var addressLabel: UILabel!
    
    var personal: PersonalData! {
        didSet {
            self.nameLabel.text    = personal.name + ", id = " + String(personal.id)
            self.ageLabel.text     = String(personal.age)
            self.addressLabel.text = personal.address
        }
    }
}

★ DataBaseManager

import Foundation


class DataBaseManager {
    
    static let sharedInstance: DataBaseManager = {
        let instance = DataBaseManager()
        return instance
    }()
    
    var db: FMDatabase!
    
    init() {
        db = FMDatabase(path: dataBasePath())
    }
    
    // Database Path
    func dataBasePath() -> String {
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as NSString
        let _path = path.stringByAppendingPathComponent("Personal.db")
        return _path
    }
    

    // Create Personal Table
    func createPersonalDataBase() {
        let sql = "CREATE TABLE IF NOT EXISTS Personal (id integer PRIMARY KEY AUTOINCREMENT, Name TEXT, Age INTEGER, Address TEXT);"
        
        // Open DataBase
        db.open()
        
        if db.executeUpdate(sql, withArgumentsInArray: nil) {
            print("Table Create Success")
        }
        
        // Close DataBase
        db.close()
    }
    
    // Insert Personal Data
    func insertPersonalData(data: PersonalData) {
        let sql = "INSERT INTO Personal (Name, Age, Address) VALUES (?, ?, ?);"
        
        db.open()
        db.executeUpdate(sql, withArgumentsInArray: [data.name, Int(data.age), data.address])
        db.close()
    }
    
    func updatePersonalData(newData: PersonalData, updateData: PersonalData) {
       
        let sql = "UPDATE Personal SET Name='\(newData.name)', age=\(newData.age), address='\(newData.address)' where Name='\(updateData.name)' AND Age=\(updateData.age)"
        
        db.open()
        db.executeUpdate(sql, withArgumentsInArray: nil)
        db.close()
    }
    
    
    // Select Personal Data
    func selectPersonalAllData() -> Array<PersonalData> {
        
        let sql = "SELECT * FROM Personal ORDER BY Name;"
        db.open()
        
        let results = db.executeQuery(sql, withArgumentsInArray: nil)
        
        var resultArray: Array<PersonalData> = []
        
        while results.next() {
            let personal = PersonalData()
            personal.id      = Int(results.intForColumn("id"))
            personal.name    = results.stringForColumn("name")
            personal.age     = Int(results.intForColumn("age"))
            personal.address = results.stringForColumn("address")
            resultArray.append(personal)
        }
        db.close()
        
        return resultArray
    }
    
    // Delete Personal AllData
    func deleteAllPersonalData() {
        let sql = "delete from Personal;"
        
        db.open()
        db.executeUpdate(sql, withArgumentsInArray: nil)
        db.close()
    }
    
    
    func resetAutoIncrement() {
        let sql = "delete from sqlite_sequence where name = 'Personal'"
        
        db.open()
        db.executeUpdate(sql, withArgumentsInArray: nil)
        db.close()
    }
}

★ Model

import Foundation

class PersonalData {
    var name   : String!
    var age    : Int!
    var address: String!
    var id     : Int = 0
    
    func setDataFromArray(dataArray: Array<String>) {
        
        for (index, value) in dataArray.enumerate() {
            switch index {
            case 0: name    = value
            case 1: age     = Int(value)
            case 2: address = value
            default: break
            }
        }
    }
}

★ CSVManager

import Foundation

class CSVManager {

    /// Bundle personal.csv 読み込み → PersonalData配列
    class func readBundleCSVData() -> Array<PersonalData>? {
        
        var resultArray: [PersonalData] = []
        
        if let csvPath = NSBundle.mainBundle().pathForResource("personal", ofType: "csv") {
            
            do {
                let csvString = try String(contentsOfFile: csvPath, encoding: NSUTF8StringEncoding)
                csvString.enumerateLines { (line, stop) -> () in
                    
                    let personalData = PersonalData()
                    personalData.setDataFromArray(line.componentsSeparatedByString(","))
                    resultArray.append(personalData)
                }
                
            } catch let error as NSError {
                print(error.localizedDescription)
                return nil
            }
        }
        return resultArray
    }
}

★ CSV

Satoh,16,Kanagawa 
Yamada,18,Tokyo 
Suzuki,25,Aichi 
Tanaka,17,Tokyo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment