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