SQLite3を使う

2010/07/14

SQLite3を直接使うには、フレームワーク「libsqlite3.bylib」の追加が必要。

Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/usr/lib/

フレームワークを追加したら.hにsqlite3をimportしておく。

#import "/usr/include/sqlite3.h"

.mに実装する。 ■データベース作成

    if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Faild to open database");
    }
    
    char *errorMsg;
    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS (row INTEGER PRIMARY KEY, field_data TEXT);";
    
    if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg)) {
        sqlite3_close(database);
        NSAssert(0, @"Error creating table: %s", errorMsg);
    }
    NSString *query = @"SELECT row, field_data FROM FIELDS ORDER BY row";
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &stmt, NULL) == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            int row = sqlite3_column_int(stmt, 0);
            char *rowData = (char *)sqlite3_column_text(stmt, 1);
            
            NSString *fieldName = [[NSString alloc]
                                   initWithFormat:@"field%d", row];
            NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
            UITextField *field = [self valueForKey:fieldName];
            field.text = fieldValue;
            [fieldName release];
            [fieldValue release];
        }
        sqlite3_finalize(stmt);
    }

■データ挿入/更新

-(void)applicationWillTerminate:(NSNotification *)notification {
    for (int i = 1; i <= 4; i++) {
        NSString *fileName = [[NSString alloc]
                              initWithFormat:@"field%d", i];
        UITextField *field = [self valueForKey:fileName];
        [fileName release];
        char *errorMsg;
        char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES(?, ?);";
        sqlite3_stmt *stmt;
        if (sqlite3_prepare(database, update, -1, &stmt, nil) == SQLITE_OK) {
            sqlite3_bind_int(stmt, 1, i);
            sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);
        }
        if (sqlite3_step(stmt) != SQLITE_DONE) {
            NSAssert1(0, @"Error updating table: %s", errorMsg);
            sqlite3_close(database);
        }
    }
}

SQLite3で利用できるメソッドやプロパティー等は、sqlite3.hを参考にすればよい。 基本的にデータベース作成、SQL実行なので、SQLがわかればそんな難しいことはないと思う。 ※sqlite3に関わる構文上で、option + クリック

ソース