Posts tagged ‘Objective-C’

XCodeでSQLiteを使用する

Cocoaアプリケーションに久々に触ったので、
忘れないようにメモ。

SQLiteを使用したい場合は、既存のフレームワーク「libsqlite3.0.dylib」を使用することで、
簡単にアクセスすることができる。

書いたコードは以下

  1.  
  2. #import <sqlite3.h>
  3.  
  4. /*間省略*/
  5.  
  6. - (NSArray *)getSQLiteTable {
  7.         sqlite3* db; //DBハンドラー
  8.         sqlite3_stmt *sth; //ステートメントハンドラー
  9.         NSString * databaseFilePath = @"/Users/admin/SQLite/test.db"; //SQLiteのファイルパス
  10.         NSMutableArray * resultArray = [ NSMutableArray array ]; //結果を格納する配列
  11.         NSString * sql = [ NSString stringWithString:@"SELECT * FROM users" ]; //SQL
  12.        
  13.         //SQLファイルをオープン
  14.         //ファイルが存在しない場合は、作成してしまうので、
  15.         //エラーにしたい場合は、ファイルの有無をNSFileManager等で判断する
  16.         if( sqlite3_open([databaseFilePath UTF8String ], &db) == SQLITE_OK )
  17.         {
  18.                 //prepare
  19.                 int result = sqlite3_prepare_v2(
  20.                                                 db,
  21.                                                 [sql UTF8String ],
  22.                                                 -1,
  23.                                                 &sth,
  24.                                                 NULL );
  25.                 //SQLiteでコンパイルできたか
  26.                 if( result != SQLITE_OK){
  27.                         NSLog(@"Faild to Sqlite");
  28.                         NSLog(@"%s",sqlite3_errmsg(db) ); //エラーになった際の詳細のエラー文
  29.                         return;
  30.                 }
  31.                 int count = sqlite3_column_count(sth); //カラムの数を取得
  32.                 int i;
  33.                 NSMutableArray * keyArray = [ NSMutableArray array ]; //カラム名の配列
  34.                 for( i=0; i<count; i++){
  35.                         //カラム名を取得し、配列に格納
  36.                         [ keyArray addObject:[ NSString stringWithUTF8String:(char*)sqlite3_column_name(sth, i)] ];
  37.                 }
  38.                
  39.                 while( sqlite3_step(sth) == SQLITE_ROW ){
  40.                         NSMutableDictionary * dict = [ NSMutableDictionary dictionary ];
  41.                         //各値を取得
  42.                         for( i=0; i<count; i++){
  43.                                 NSString * value = [ NSString stringWithUTF8String:(char*)sqlite3_column_text(sth, i)];
  44.                                 [ dict setValue:value forKey:[ keyArray objectAtIndex:i ] ];
  45.                
  46.                         }
  47.                         //結果配列に格納
  48.                         [ resultArray addObject:dict ];
  49.                 }
  50.                 //ステートメントハンドラを破棄(これしないとメモリが廃棄されない)
  51.                 sqlite3_finalize(sth);
  52.         }
  53.         sqlite3_close(db); //DBを閉じる
  54.  

ポイント
・16行目 ・・・ SQLiteのファイルを開く。MySQLとかの場合はconnectと同じことかと。
         ただし、ファイルが存在しなくても作成されてしまうので、ファイルが存在しない場合にエラーにする場合は、
         NSFileManagerで存在チェックするべき。

久々にMacを触ったら「objc_class_nameクラス名」というエラーに引っかかった。
OS 10.6 XCode 3.2のお話です。

開発環境のマシンが変更になっていたので、
昔のソースを引っ張ってビルドしてみたら、こんなエラーで引っかかった。

とりあえず分からなかったので、調べてみたところ
こちらのサイトを見てみた。
iPhoneメモ “.objc_class_name_クラス名”, referenced from:

なるほど、いらなくなったソースを消すと出やすいのか。
まずは、クリーニングということで、やってみたが、
事態は一向に変わらず。。。

まずはリンクが怪しいということで、
自作のFrameworkをクリーニング、再ビルド。

Frameworkを一度削除し、再度新規に登録。
クリーニングを行い、再度ビルド。

まだダメ。

これは、もうクリーニングではないなということで、
設定を再度見直し。
#そもそもソース削除してないし。。。

ターゲットのLink Binary With Librariesの中を見ると、
なんとCocoaとCarbonがないではないか。
そりゃ動かんよ。

そこにCocoaとCarbonを移し、ビルド。
うまく行ったと思いきやまた同じエラー(クラス名が違う)

再度、設定を見直すと、
ターゲットの「ソースをコンパイル」の部分に
エラーになったクラスのソースが含まれて無いじゃん!

ということで、そこに目的のファイルを入れたら、
無事動きました。

久々だったので、いろいろ対処を忘れちゃいました。