Hatena::Groupiphone-dev

haoyayoi Dev Style このページをアンテナに追加 RSSフィード

2009-05-03

FMDatabaseを使ったSQLite クエリにおけるFormatter文字

| 10:26 | FMDatabaseを使ったSQLite クエリにおけるFormatter文字 - haoyayoi Dev Style を含むブックマーク はてなブックマーク - FMDatabaseを使ったSQLite クエリにおけるFormatter文字 - haoyayoi Dev Style FMDatabaseを使ったSQLite クエリにおけるFormatter文字 - haoyayoi Dev Style のブックマークコメント

FMDatabaseを使ってqueryを延々と書いてて少々はまったのでメモ。

わりとSQLiteをプロジェクト内にもちこむ方法と、そこからDocumentsへのコピーあたりまでは資料充実してるわけですが、そこから先になると割と書いてる人いなくて、とりあえず勝手に皆挫折したものだと思う事にしました。

queryに用いるformatter

NSStringには幾つかformatとして用いる文字列があるわけですが、このformat用文字をqueryに用いると想定外なエスケープがなされて泣きめをみます。'test'が\'test\'になったりして。

ここらへんをクリアしているアプリは何かないものかと思い、twitterクライアントあたりでsqliteを使っていて、かつオープンソースであるものを探した結果、twitter fonがありました。

TwitterFon - github

ソースを読んだ結果、対処方法は分かりました。

 [[FMDatabase databaseWithPath:dbPath] executeUpdate:@"REPLACE INTO users VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)"];

最初は何かが文字化けして?(はてな)になってるのかなと思ったんですが、文字通り?(はてな)がformatterになっています。FMDatabase内部では、このquery処理のためにGCCのビルトイン関数を用いているようで、この辺りの処理についてはそもそもSDKドキュメントに含まれるはずもない、という様子。なおNSStringで?をFormatterにあてがっても、代入されずに?として処理されます。

SQLiteのformatter

SQlite3.0のAPIドキュメントを見てみたところ、?がSQLiteの代入子にあたる、ということで。他の言語では文字連結でクエリを作ってたものだから、存在そのものを初めて知りました。