resultテーブル側の構成変えます。
 levelの記録ではなくcomplete(出題数)を記録するようにします。ま、そらそうだわな。levelで記録していってたら、途中で、やっぱlevel 1に出題数4としてたのを出題数5にしようと変えた場合、それまでの記録が全部おじゃんになっちゃうし~。はやく気づけよ俺、みたいな。
 というわけで

create table result(datetime real, complete int, correct int)

とします。でもってデータベースファイル名は"record.db"としました。なので、今回、別にアプリの削除はしなくてもいいです。ま、気になる人は削除してから実行してください。

 で、前回予告したように、データベース部分を新規クラスとして定義します。

@interface recorder : NSObject

 ソースの作り方は「iPhoneアプリ開発、その(60)」のChimpanzeeLayouter.m/hの作り方を参考にしてね。

 recorder.hの定義はこんな感じ。

@interface recorder : NSObject {
sqlite3* database; // データベース
sqlite3_stmt* statementForRecord; // 記録用に使用するステートメント
sqlite3_stmt* statementForAverage; // 平均値計算用に使用するステートメント
}

// 指定されたレベルと正解数をresultレコードに時間とともに記憶。
- (void)record:(int)inLevel correct:(int)inCorrect;
// 指定されたレベルの成功率の計算。
- (double)average:(int)inLevel;
// レベルに対する出題数を返す。
- (int)levelToComplete:(int)inLevel;
// 指定されたレベルの記録の一覧を表示。
- (void)dump:(int)inLevel;

 前回のdbAppDelegate.mのapplicationDidFinishLaunchingメソッドに書いたデータベース処理部分は新しいクラスのinitメソッドに移動です。でもっていよいよ

- (void)record:(int)inLevel correct:(int)inCorrect

で"insert into result(datetime, complete, correct) values(?, ?, ?)"ってやってます。日付はサンプルSQLiteBooksを参考にして

NSDate* now = [NSDate date];
sqlite3_bind_double(statementForRecord, 1, [now timeIntervalSince1970]);

ってしてます。1970年1月1日0時0分0秒から現在の日付時間の間隔を返すみたいです。オートリリース機能が効くので

[now release];

はしません。ちなみにSQLiteBooksでreleaseしてるのは、Book.hで「@property (copy, nonatomic) NSDate *copyright;」としてるからだと思われ。

- (double)average:(int)inLevel

でも同じように"select avg(correct/result.complete) from result, levelinfo where levelinfo.complete=result.complete and levelinfo.level = ?"てして、こっちは返り値があるので

result = sqlite3_column_double(statementForAverage, 0);

で結果を受け取ってます。

 で、用意されたrecorderクラスをdbAppDelegate.mのapplicationDidFinishLaunchingで作成して、ランダムにレベルとゲーム結果を発生させて登録させ、その後、1から10レベルに付いて成功率を表示としました。

- (void)dump:(int)inLevel {

を使ってますが、こいつはSQL文によって受け取った成功率が本当に正しいのか検収用に、指定されたレベルのゲーム結果一覧表示と、SQL分を使わず、自前のループで成功率を計算したものを表示するメソッドです。例えば下のコンソール表示だと

level:6 avg(0.200000) complite=9
5 9 2 6 4 (1/5)=0.200000



レベル6のSQL文から得た成功率は0.200000
complite(出題数)は9
結果は5 9 2 6 4で5回のうち1回だけ成功した。ので0.200000

という感じっす。

 毎回、起動するたびにランダムにゲーム結果が10個追加されていくので、表示される各レベルの成功率もどんどん変化していきますな。計算もあってるみたい(成功率なので、レベルに対する出題数と正解数が一致した時が成功、しなかった時は失敗とし、その平均)。コンソール出してないと、ただ白い画面が出るだけのアプリなんで、そこんとこ気をつけるように。コンソールの出し方は「iPhoneアプリ開発、その(39)」を参照。
 いい感じ。
 「iPhoneアプリ開発、その(74)」から始まったSQLとの格闘もいよいよフィナーレは近いぜ。
 

random generate result level(correct/complite)
level:9 (6/12)
level:6 (5/9)
level:7 (8/10)
level:10 (11/25)
level:6 (9/9)
level:6 (2/9)
level:6 (6/9)
level:2 (2/5)
level:10 (0/25)
level:6 (4/9)
level:1 avg(0.000000) complite=4
(0/0)=nan
level:2 avg(0.000000) complite=5
2 (0/1)=0.000000
level:3 avg(0.000000) complite=6
(0/0)=nan
level:4 avg(0.000000) complite=7
(0/0)=nan
level:5 avg(0.000000) complite=8
(0/0)=nan
level:6 avg(0.200000) complite=9
5 9 2 6 4 (1/5)=0.200000
level:7 avg(0.000000) complite=10
8 (0/1)=0.000000
level:8 avg(0.000000) complite=11
(0/0)=nan
level:9 avg(0.000000) complite=12
6 (0/1)=0.000000
level:10 avg(0.000000) complite=25
11 0 (0/2)=0.000000

------------
サンプルプロジェクト:db3.zip