7月
4

SQLite+FMDBで日付型を扱う場合の注意点

Author msota    Category 逆引き備忘録     Tags

忘れないように整理しておく。

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」のような値を登録できない。

Post comment