【swift】SQLiteで新しいデータを追加 / 保存する【CoffeeNote開発メモ】

データを保存する

NSUserDefaultの使い方がだいたい分かってきたところで,自分の作りたいアプリにはやっぱり向いてないことも同時に分かってきたw

ということで,SQLiteで保存する方法も試してみる

SQLite

導入

ここあたりをみてBridging-Header.hというObjective-Cのヘッダーファイルを生成してswiftベースでSQLiteを使えるようにした.

Xcode 6 (Beta5) : SwiftでSQLite | MUSHIKAGO APPS MEMO

SwiftでSQLiteラッパーライブラリのFMDBを使ってみよう | ワンダープラネットエンジニア Blog

Objective-Cでは定番っぽいラッパーのfmdbというものを入れて使ってみる.

使ってみる

IBActionでStoryboardで配置したボタンにメソッドを割り当てて,同一内のblendNameって名前をつけたtextFieldの内容を保存して,保存が行われるたびにconsoleにnotesテーブルの内容を表示するようにした.

@IBAction func pushButton(sender: AnyObject) {
    
    // sqlite from here
    let _dbfile:NSString = "sqlite.db"
    let _dir:AnyObject = NSSearchPathForDirectoriesInDomains(
      NSSearchPathDirectory.DocumentDirectory,
      NSSearchPathDomainMask.UserDomainMask,
      true)[0]
    let fileManager:NSFileManager = NSFileManager.defaultManager()
    let _path:String = _dir.stringByAppendingPathComponent(_dbfile)
    
    // println(_path)
    
    let _db = FMDatabase(path: _path)
    
    // Create a query to create a notes table
    // let _sql = "CREATE TABLE notes (id INTEGER PRIMARY KEY AUTOINCREMENT,blendName TEXT);"
    let sql_create_table = "CREATE TABLE IF NOT EXISTS notes (nid INTEGER PRIMARY KEY AUTOINCREMENT, blendName TEXT);"
      
    _db.open()
  
    var result = _db.executeStatements(sql_create_table)
    // println(result)
    
    let db = FMDatabase(path: _path)
      
    let sql_insert = "INSERT INTO notes (blendName) values (?);"
    
    var _result_insert = _db.executeUpdate(sql_insert, withArgumentsInArray: [self.blendName.text])
    
    
    // Debug for comfirm the inserted data

    let sql_select = "SELECT nid, blendName FROM notes ORDER BY nid;"
    
    // var rows = _db.executeQuery(sql_select, withArgumentsInArray: [2])
    var rows = _db.executeQuery(sql_select, withArgumentsInArray: nil)
    
    while rows.next() {
      // カラム名を指定して値を取得
      let nid = rows.intForColumn("nid")
      // カラムのインデックスを指定して取得
      let blendName = rows.stringForColumnIndex(1)
      
      println("nid = \(nid), blendName = \(blendName)")
    }
    
    _db.close()
  
  }