iPhoneでSQLite3を使う7(サンプルソース)

SQLite3の過去の記載に間違いがちらほら、気づいたところは直しました。まだ間違いがあるかもしれませんので、サンプルソースを確認していただいた方が確実です。また、テーブルの構造を変更しましたのでご注意ください。
サンプルは、Testボタンのみw

ボタンを押すと、下記のように動きます。
1.DBをオープン
2.トランザクションの開始
3.テーブルの全件を削除
4.2件のデータをInsert
5.テーブルの中身をSelect
6.Commit
という流れです。DB処理のメイン部分は、前回の骨格どおり下記のように作りました。複数回呼ぶ想定のInsert文のPrepareは、1回だけ呼ぶようにしています。

-(void)dbTest {
    @try {
        // DB接続
        [self dbOpen];
        
        @try {
            // Transaction start
            [self dbBegin];

            // Delete
            [self userInfoDeleteAll];
            
            // Prepare insert sql
            [self prepareInsertSQL];
            
            // Insert
            UserInfo* userInfo;
            userInfo = [UserInfo ID:@"111111" Name:@"Name1" ScreenName:@"ScreenName1" ProfileImageUrl:@"http://url1" FollowersCount:0 FriendsCount:0 Text:@"Text1"];
            [self userInfoInsert:userInfo];
            [userInfo release];
            
            userInfo = [UserInfo ID:@"222222" Name:@"Name2" ScreenName:@"ScreenName2" ProfileImageUrl:@"http://url2" FollowersCount:0 FriendsCount:0 Text:@"Text2"];
            [self userInfoInsert:userInfo];
            [userInfo release];

            // Finalize insert sql
            [self finalizeInsertSQL];

            // Select
            [self userInfoSelect];

            // DBの更新を確定する。
            [self dbCommit];
        } @catch (DBException* ex) {
            // DBエラーの処理を記述
            NSLog(@"%@ %@(%@)", [ex name], [ex message], [ex method]);
            // DBをもとの状態に戻す。
            [self dbRollback];
        }
        // DB切断
        [self dbClose];
        // catch節に、@catch (DBException* ex)と書くと、DBExceptionを捕まえてくれます。
    } @catch (DBException* ex) {
        // DB Openエラーの処理を記述
        NSLog(@"%@ %@(%@)", [ex name], [ex message], [ex method]);
        // DBExceptionじゃない場合は、次のcatch節で処理されます。
    } @catch (NSException* ex) {
        // その他エラーの処理を記述
        NSLog(@"%@/%@",[ex name], [ex reason]);
    } @finally {
        // 必要なら実装
    }
}

そのまま実行すると

2011-03-12 19:07:01.830 Sample[5544:207] DB Open
2011-03-12 19:07:01.832 Sample[5544:207] DB Transaction start
2011-03-12 19:07:01.833 Sample[5544:207] DB Delete all
2011-03-12 19:07:01.835 Sample[5544:207] DB Insert
2011-03-12 19:07:01.845 Sample[5544:207] DB Insert
2011-03-12 19:07:01.846 Sample[5544:207] DB Select
2011-03-12 19:07:01.846 Sample[5544:207] ID=111111 Name=Name1 ScreenName=ScreenName1 ProfileImageUrl=http://url1 FollowersCount=0 FriendsCount=0 Text=Text1
2011-03-12 19:07:01.874 Sample[5544:207] ID=222222 Name=Name2 ScreenName=ScreenName2 ProfileImageUrl=http://url2 FollowersCount=0 FriendsCount=0 Text=Text2
2011-03-12 19:07:01.875 Sample[5544:207] DB Commit
2011-03-12 19:07:01.908 Sample[5544:207] DB Close

思い通りに動いていることがわかります。


異常系の確認もしてみましょう。たとえば、DBのオープンを故意に失敗するように。database_filename = @"twitterDB.sqlite";を、database_filename = @"xxx.sqlite";に書き換えて実行してみると

2011-03-12 19:09:15.557 Sample[5572:207] DB Open
2011-03-12 19:09:15.561 Sample[5572:207] DB Error Open failed(ViewController/dbOpen)

という感じで、DB Closeも通らずに終わります。SELECT文のエラーを拾うように作ってなかったり、ところどころ手を抜いてますが基本的な動きは確認できました。今日は、ここまで


ソースコードはこちら
http://www.eonet.ne.jp/~einstein/iOS/design/Sample06.zip