iOS

Objective-C でデータベースファイル(SQLite)を操作する

前回の記事で、ターミナルから SQLite のデータベースを作成したので、これを Objective-C で操作してみたいと思います。

事前準備

iOS Application の Single View Application で ARC を使用するにチェックを入れて、プロジェクトを作成し、前回の記事で作成したデータベースファイル(test.sqlite)をプロジェクトに突っ込みます。

そして、SQLite のライブラリーを追加する必要があります。プロジェクト名 → Target → Build Phases → Link Binary With Libraries から libsqlite3.0.dylib を追加します。

SQLite を触る時には、「#import <sqlite3.h>」を記述して、SQLite のライブラリーをインポートします。

Objective-C でデータベースファイルを操作する

SQLiteManager というクラスを作成して、このクラスでデータベースを触るようにしました。

SQLiteManager.h

#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface SQLiteManager : NSObject

+ (void)handleDatabaseWithSql:(NSString *)sql;

@end

SQLiteManager.m

#import "SQLiteManager.h"

@implementation SQLiteManager

+ (void)handleDatabaseWithSql:(NSString *)sql
{
    NSString *databaseName = @"test.sqlite";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];
    NSString *databasePath = [path stringByAppendingPathComponent:databaseName];
    
    NSFileManager *manager = [NSFileManager defaultManager];
    NSError *error = nil;
    
    // 文章フォルダにデータベースファイルが存在しているかを確認する
    if (![manager fileExistsAtPath:databasePath]) {
        
        // 文章フォルダに存在しない場合は、データベースをコピーする
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
        BOOL success = [manager copyItemAtPath:defaultDBPath toPath:databasePath error:&error];
        
        if (success) {
            NSLog(@"Database file copied.");
        } else {
            NSLog(@"%@", error);
            return ;
        }
    } else {
        
        NSLog(@"Database file exist.");
    }
    
    sqlite3 *database;
    sqlite3_stmt *statement;
    
    // 文章フォルダに用意されたデータベースファイルを開く
    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        
        int result = sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, NULL);
        
        // SQLite のコンパイルに失敗した場合
        if (result != SQLITE_OK) {
            NSLog(@"Failed to SQLite compile.");
            return ;
        }
        
        // SQL 文を実行し、結果が得られなくなるまで繰り返す
        while (sqlite3_step(statement) == SQLITE_ROW) {

            NSLog(@"%d, %@", sqlite3_column_int(statement, 0),[NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)]);
        }
        
        // データベースを閉じる
        sqlite3_close(database);
    } else {
        
        NSLog(@"Can't open database.");
    }
    
    return ;
}

@end

ViewController で、このように呼び出します。

「#import “SQLiteManager.h”」を宣言しています。

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [SQLiteManager handleDatabaseWithSql:@"SELECT * FROM hoge"];
}

出力はこんな感じです。

All Output

Database file exist.
1, rakuishi
2, rakuiso
3, rakutaro

参考

EZ-NET: iPhone プログラムで SQLite を使用する

新標準SQLite (オープンソースRDBMSシリーズ)