iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
iOS SDKがCoreDataに対応してからsqliteを直接利用する機会は減ったと思われるが、やはり、知っていた方が便利なので挑戦する。
以前は、Apple DeveloperサイトでSQLiteBooksといるサンプル・コードが入手できたが、今はないようだ。ただ、著者は以前入手しておいたので、それを参考にした。良かった!
sqliteを使用する為には、『libsqlite3.0.dylib』をリンクし、sqlite3.hをインクルードする。
#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