★ 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