DRYな備忘録

Don't Repeat Yourself.

iOSでSQLiteを使ってデータ保存してみる【Xcode5.0.2】

Goal

アプリ内のデータの永続化どうすんのかなーと思ったらsqliteを使うみたいじゃない。ということで、使ってみた。

全ての記録はここ Commits · otiai10/Unko.Sample.SQLite · GitHub です。

なお

sqliteを生で書くのは大変でした。普通はCoreDataとか使うっぽい

いいんです!これは基礎勉強だから!僕は生で触るんです!

Log

1. プロジェクトつくる

  • Xcode起動
  • Create new project
  • Single View Application
  • Project Name : Unko

2. sqlite3をimportする

ただアプリケーションなファイルにimport文書くだけじゃダメで、Unko.xcodeprojの一番下のLinked Frameworks and Librariesで、リンクを追加する必要がある。

f:id:otiai10:20140110003049p:plain

3.ちょっとコード書く

参考 : iOSでSQLiteを使う場合の手順 | PLUS

(´-`).。oO( とりあえずメインのViewController.mのviewDidLoadに全部書いちゃうか...w

- (void)viewDidLoad
{
    [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
    // {{{ ここから
    
    // とりあえず、使用する物理ファイル名を決めちゃう
    NSString *dataFileName = @"unkolist.sqlite3";
    NSString *dataFileFullPath;
    
    // 1.【物理ファイルを準備します】
    
    // 使用可能なファイルパスを全て取得する
    NSArray *availablePats = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 最初のものを使用する
    NSString *dir = [availablePats objectAtIndex:0];
    // ファイルマネージャを召還する
    NSFileManager *myFM = [NSFileManager defaultManager];
    // 物理ファイルって既にありますか?
    dataFileFullPath = [dir stringByAppendingPathComponent:dataFileName];
    BOOL fileExists = [myFM fileExistsAtPath:dataFileFullPath];
    // 無い場合はつくる
    if (! fileExists) {
        BOOL isSuccessfullyCreated = [myFM createFileAtPath:dataFileFullPath contents:nil attributes:nil];
        if (! isSuccessfullyCreated) {
            NSLog(@"新規ファイル作成に失敗しました=>%@", dataFileFullPath);
        }
    }
    
    // 2.【sqiteを開く】
    
    // FIXME: この書き方だとメモリリークする?
    sqlite3 *sqlax;
    // 開きます
    BOOL isSuccessfullyOpened = sqlite3_open([dataFileFullPath UTF8String], &sqlax);
    if (isSuccessfullyOpened != SQLITE_OK) {
        NSLog(@"sqlite開けませんでした!=> %s", sqlite3_errmsg(sqlax));
    }
    
    // 3.【queryとstatementを確保しとこう】
    NSString *query;
    sqlite3_stmt *statement;
    
    // 4.【sql文を実行していく】
    
    // CREATE IF NOT EXISTS
    query = @"CREATE TABLE IF NOT EXISTS unkos (name TEXT)";
    sqlite3_prepare_v2(sqlax, [query UTF8String], -1, &statement, nil);
    sqlite3_step(statement);
    sqlite3_finalize(statement);
    
    // INSERT
    NSString *name = [NSString stringWithFormat:@"%@%d",@"otiai",arc4random() % 99];
    query = [NSString stringWithFormat:@"INSERT INTO unkos VALUES(\"%@\")", name];
    sqlite3_prepare_v2(sqlax, [query UTF8String], -1, &statement, nil);
    sqlite3_step(statement);
    sqlite3_finalize(statement);
    
    // SELECT
    query = @"SELECT name FROM unkos";
    sqlite3_prepare_v2(sqlax, [query UTF8String], -1, &statement, nil);
    while (sqlite3_step(statement) == SQLITE_ROW) {
        char *ownerNameChars = (char *) sqlite3_column_text(statement,0);
        NSLog(@"Found : %s", ownerNameChars);
    }
    sqlite3_finalize(statement);
    
    // 5.【sqlite閉じる】
    sqlite3_close(sqlax);
    
    // }}} ここまで書いた
}

うごいたー

とりあえず停止&起動するたびにレコードが増えているのを確認できた。

f:id:otiai10:20140110003920p:plain



マヂ無理...

CoreData使ぉ...

DRYな備忘録