忘れないように整理しておく。
SQLiteとFMDBで日付型を扱う際の前提
まず、整理の前提となる事実。
- SQLiteでは日付型そのものの型はないので、日付を格納する列はtextやrealで代替定義している
- FMDBは日付型を扱うためのメソッドを提供しているが、列定義がrealであることを想定している
- FMDBは、real値を日付型として返すために NSDate クラスの dateWithTimeIntervalSince1970 を利用している
- FMDBは、real値を日付型としてSQLiteに登録するために NSDate クラスの timeIntervalSince1970 を利用している
- 日付情報はUNIX時間(1970年1月1日を起源とした差分値)で管理している。NSDateクラスには、その前提で倍精度数値データを扱うためのメソッドがある(dateWithTimeIntervalSince1970 / timeIntervalSince1970)
対応方針
上記の前提を踏まえると、SQLite, FMDBの組合せでアプリケーションを組む場合は、以下のような方針にすれば良さそうだ。
- SQLiteのテーブル定義時は、日付を扱う列はreal型で定義する
- FMDBで日付型データを参照する場合は dateForColumn / dateForColumnIndex を使う(NSData型の値が戻される)
- FMDBで日付情報を登録/更新する場合は、NSDate型にしておけば、あとはFMDBが勝手にやってくれる
実際にはNSDateFormatterで書式を整えたりする必要があるが、FMDBやSQLiteとは直接関係ないのでとりあえず考えないでおく。
問題点
テストデータを事前に手操作なり何なりでDBに登録しておきたい場合、timeIntervalSince1970 なり何なりで変換したreal値を登録しなければならない。ごく普通に「2011/06/20」のような値を登録できない。