アイフォンcardstackのどこが悪いのかをチェックする検討会 6/4

アイフォンcardstackのどこが悪いのかをチェックする検討会

NSLog(@”dbPath:%@”,dbPath);

sql=”select MySQLで使ったコマンドでなにか試してみて;”;
sql=”SELECT count(*) FROM cardstack”;

sql=”SELECT count(*) FROM cardstack;”;
つまりセレクト文が終了していませんでした。「;」が抜けてました。

SQLite3コマンド

a-imac:CardStack a$ sqlite3 cardstack.sqlite3
SQLite version 3.6.12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> select count(*) from cardstack;
10
sqlite> select * from cardstack;
(何も応答無し)
sqlite> .mode list
sqlite> .tables
cardstack
sqlite>

sqlite> .explain ON
sqlite> select * from cardstack;

sqlite> select card_id from cardstack;
card
—-
1
2
3
4
5
6
7
8
9
10
(有効なデータは2行のみ。しかし、10行のデータが挿入されています)

sqlite> select fore from cardstack;
fore
—-
red
black

sqlite> select back from cardstack;
back
—-
(文字化け、UTFをEUCで表示させたから)
(文字化け、UTFをEUCで表示させたから)
sqlite> select count(*) from cardstack;
coun
—-
10
sqlite>

sql = “SELECT card_id, fore, back FROM cardstack ORDER BY card_id;”;
if(sqlite3_prepare_v2(dbs, sql, -1, &statement, NULL)==SQLITE_OK){

//今日6/5 のエラーこの下の”sqlite3_step(statement)”でエラーのようです。
if(sqlite3_step(statement)==SQLITE_ROW){
NSString *value=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
//行数を取得できていない。
cardNum=[value intValue];
NSLog(@”DB:%@”,value);
//chtest=[value intValue];
} else{
NSLog(@”select command:%s”,sql);
NSLog(@”DB error cant read 2 step here “);
}//if3

}else{
NSLog(@”DB error cant read 1”);
}//if2

★★★つづき
SELECT文で取得する値が変わっていたのに、本のままコードを書いていたので、sqlite3_step()の 戻り値が変わることを知りませんでした。
Switch文にして戻り値が変化しても良いように書き換えました。
とりあえず、SQLITE_DONEが取得できたようなので、今日はこれまで。

sql = “SELECT card_id, fore, back FROM cardstack ORDER BY card_id;”;
if(sqlite3_prepare_v2(dbs, sql, -1, &statement, NULL)==SQLITE_OK){

//ここがsqlite3_step(statement) 原因ですね 2012/06/04
switch (sqlite3_step(statement)) {
case SQLITE_ROW:
//一行ずつ取得する場合
NSLog(@”SQLITE_ROW”);
break;
case SQLITE_DONE:
NSLog(@”command done”);
NSLog(@”select command:%s”,sql);
break;

case SQLITE_ERROR:
NSLog(@”DB error cant read 2 step here “);
break;

default:
NSLog(@”DB error_OTHER”);
break;
}

}else{
NSLog(@”DB error cant read 1″);
}//if2
NSLog(@”cardNum= %d”,cardNum);

sqlite3_finalize(statement);

参考にしたサイト
SQLite を使って郵便番号から住所を検索するプログラム

c/c++でsqliteを使う方法

こちらの記事もどうぞ