はじめに
SwiftでSQLiteを利用するためにObjective-Cの時代から有能なFMDBを利用しようと思って、ネット上で落ちている情報で実装していたらハマったのでメモ。
今回の話について
利用の仕方などについてはネットで落ちている情報で十二分なので、今回は私がハマったFMDBを組み込むまでをメモがてら書いていきます(´-ω-`;)←疲れてます。
ということで、必要なところ以外は他の方の記事にお任せしています。
ダウンロードから途中までの設定
こちらのサイトを参照してください。↓
★ XcodeでSwiftを勉強 その20 〜FMDBライブラリを使う〜
ちなみにFMDBはGitHubから
ハマったところについて
はい、ということで、ある程度の設定までは任せたのですが、ここからが本題です。私も上記のような記事を参考にさせていただいて組み込もうとしたのですが、パスを通しても「<プロジェクト名>-Bridging-Header.h」ファイルが見つからないよぉ( ; ; )っと言われてました。
しかも「FMDatabase.h」なんてファイルなんかねぇよ!っとも...。え、パスもあってるし、ファイルもあるのに...っと思っていて、もしかしたらfmdbのフォルダ内にあるから「
<プロジェクト名>-Bridging-Header.h」へのパスではなく、「<プロジェクト名>-Bridging-Header.h」の「FMDatabase.h」たちへのパスが通らないのではないかと「<プロジェクト名>-Bridging-Header.h」の中を次のようにすると...
//
// プロジェクト名-Bridging-Header.h
// プロジェクト名
//
// Created by Fantm21 on 2015/05/14.
// Copyright (c) 2015年 Fantm21. All rights reserved.
//
#ifndef プロジェクト名_プロジェクト名_Bridging_Header_h
#define プロジェクト名_プロジェクト名_Bridging_Header_h
#import "fmdb/FMDatabase.h"
#import "fmdb/FMResultSet.h"
#import "fmdb/FMDatabaseAdditions.h"
#import "fmdb/FMDatabaseQueue.h"
#import "fmdb/FMDatabasePool.h"
#import "sqlite3.h"
#endif
すると、Errorが消えた(´・ω・`;)<やっぱりか。
これで万事解決と思ったら...
次の障害
ViewController.swiftに次のように書いて実行すると、
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let paths = NSSearchPathForDirectoriesInDomains(
.DocumentDirectory,
.UserDomainMask,
true)
let _path = paths[0].stringByAppendingPathComponent("hoge.db")
let db = FMDatabase(path:_path)
db.open()
db.close()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
"_OBJC_CLASS_$_FMDatabase", referenced from:
というERRORが...
Σ(`・д・´)なぬ!!
という一難去ってまた一難。
まぁ戯言は置いといて、結果から離すと、FMDBのファイルがコンパイルされていないらしいです...orz
ということで、
解決策
TARGETSを選択して、BuildPhases->CompileSourcesで、+ボタンで「Add Other...」からプロジェクト内に配置したfmdb内の.mファイルを全て選択して追加すると...
無事ビルドできました(´艸`)ァハ♪
とりあえずこれでローカルでSQLite使えるようになってよかった。
もう1つあった問題
実は上記の内容は、すでに作りこんでいた方でErrorのままでほったらかしにしてテスト用のプロジェクトでも出たErrorに対しての内容だったのですが、元のプロジェクトではこれらの解決をしてもまだErrorとなっていました。すでに解決したのですが、実はパスがおかしくなっていました(´-ω-`;)
サイトによって間違ったパスを表示していて、それを使ってしまって死んでたようです...
どのパス?
ちなみにここで言っているパスを設定するところは、
Target > Build Settings >Swift Compiler - Code Generation > Objective-C Bridging Header
です。ここで指定しないといけない正しいパスは次の通り、
$(SRCROOT)/$(PROJECT)/<プロジェクト名>-Bridging-Header.h
注:もちろん<プロジェクト名>はご自身のプロジェクト名に変えてください。