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