トップ «前の日記(2012-07-02) 最新 次の日記(2012-07-04)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|

2012-07-03 [iOS]SQLite

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

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

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

libsqlite3.0.dylib
#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

_ 【Cocoa練習帳】

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

トップ «前の日記(2012-07-02) 最新 次の日記(2012-07-04)» 編集