[iOS]SQLite | Cocoa練習帳

[iOS]SQLite

iOS SDKがCoreDataに対応してからsqliteを直接利用する機会は減ったと思われるが、やはり、知っていた方が便利なので挑戦する。




以前は、Apple DeveloperサイトでSQLiteBooksといるサンプル・コードが入手できたが、今はないようだ。ただ、著者は以前入手しておいたので、それを参考にした。良かった!




sqliteを使用する為には、『libsqlite3.0.dylib』をリンクし、sqlite3.hをインクルードする。




lib


#import <sqlite3.h>



今回は、sqliteとのやり取りを隠す、Databaseクラスを用意した。以下がヘッダーだ。




#import <Foundation/Foundation.h>
#import <sqlite3.h>
 
@interface Database : NSObject
 
@property (nonatomic, assign) sqlite3   *database;
 
- (void)demo;
 
@end



内容は以下のとおり。初期化と破棄、そして、簡単なSQLの実行。




#import "Database.h"
 
@interface Database ()
@end
 
@implementation Database
 
@synthesize database = _database;
 
- (id)init
{
    DBGMSG(@"%s", __func__);
    self = [super init];
    if (self) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database.sql"];
        if (sqlite3_open([path UTF8String], &_database) != SQLITE_OK) {
            sqlite3_close(_database);
            self.database = NULL;
            DBGMSG(@"Failed to open database with message '%s'.", sqlite3_errmsg(_database));
        }
    }
    return self;
}
 
- (void)dealloc
{
    DBGMSG(@"%s", __func__);
    if (sqlite3_close(_database) != SQLITE_OK) {
        DBGMSG(@"Error: failed to close database with message '%s'.", sqlite3_errmsg(_database));
    }
    self.database = NULL;
    /* [super dealloc]; */
}
 
- (void)demo
{
    DBGMSG(@"%s", __func__);
    if (NULL == self.database)  return;
    
    const char *sql = "CREATE TABLE demo ('id' INTEGER PRIMARY KEY, 'name' CHAR(32))";
    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2(self.database, sql, -1, &statement, NULL) == SQLITE_OK) {
        DBGMSG(@"[OK]sqlite3_prepare_v2(), srl: %s", sql);
        while (sqlite3_step(statement) == SQLITE_ROW) {
            DBGMSG(@"[OK]sqlite3_step()");
        }
    }
    sqlite3_finalize(statement);
    
    sql = "INSERT INTO demo(name) VALUES ('test')";
    if (sqlite3_prepare_v2(self.database, sql, -1, &statement, NULL) == SQLITE_OK) {
        DBGMSG(@"[OK]sqlite3_prepare_v2(), srl: %s", sql);
        while (sqlite3_step(statement) == SQLITE_ROW) {
            DBGMSG(@"[OK]sqlite3_step()");
        }
    }
    sqlite3_finalize(statement);
 
    sql = "SELECT id FROM demo";
    if (sqlite3_prepare_v2(self.database, sql, -1, &statement, NULL) == SQLITE_OK) {
        DBGMSG(@"[OK]sqlite3_prepare_v2(), srl: %s", sql);
        while (sqlite3_step(statement) == SQLITE_ROW) {
            DBGMSG(@"[OK]sqlite3_step()");
            int primaryKey = sqlite3_column_int(statement, 0);
            NSLog(@"primaryKey: %d", primaryKey);
        }
    }
    sqlite3_finalize(statement);
}
 
@end



サンプルでは、demoメソッドを呼ぶボタンを用意して、動作確認した。上手くいったようだ。




2012-07-03 20:20:28.602 Database[7795:f803] -[Database init]
2012-07-03 20:20:31.391 Database[7795:f803] -[Database demo]
2012-07-03 20:20:31.393 Database[7795:f803] [OK]sqlite3_prepare_v2(), srl: CREATE TABLE demo ('id' INTEGER PRIMARY KEY, 'name' CHAR(32))
2012-07-03 20:20:31.461 Database[7795:f803] [OK]sqlite3_prepare_v2(), srl: INSERT INTO demo(name) VALUES ('test')
2012-07-03 20:20:31.464 Database[7795:f803] [OK]sqlite3_prepare_v2(), srl: SELECT id FROM demo
2012-07-03 20:20:31.464 Database[7795:f803] [OK]sqlite3_step()
2012-07-03 20:20:31.465 Database[7795:f803] primaryKey: 1



ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/ios/Database - GitHub


関連情報
iPhone デベロッパーズ クックブック



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)