0

こんにちは、私は最近 sqlite を学びました。以下のコードを使用して名前が存在するか、sqlite に存在しないかを確認していますが、結果が得られません。私を助けてください。BOOL columnExists = NO;

        sqlite3_stmt *selectStmt;
        NSString *upperString = [[NSString alloc] initWithFormat:exptypeFld.text];
        NSString* changeString = [upperString uppercaseString];
        NSLog(@"changeString %@",changeString);
        [upperString release];
        const char *sqlStatement = [[NSString stringWithFormat:@"SELECT expensetype from expensetypes where upper(expensetype) = '%@'",changeString] UTF8String];
        NSLog(@"char is %s",sqlStatement);
        if(sqlite3_prepare_v2(db, sqlStatement, -1, &selectStmt, NULL) == SQLITE_OK)
        {
            NSLog(@"Same........");
            columnExists = YES;
        }
4

2 に答える 2

0

sqlite3_step実際にクエリを実行するために呼び出すことはありません。また、この時点でデータベース接続は開いていますか? また、ステートメントの処理が完了したら、ステートメントを終了する必要があります。また、文字列形式を使用して値をクエリにバインドしないでください。を使用する必要がありますsqlite3_bind_xxx

NSString *upperString = exptypeFld.text; // no need for the string format
NSString* changeString = [upperString uppercaseString];
NSLog(@"changeString %@",changeString);

const char *sqlStatement = "SELECT expensetype from expensetypes where upper(expensetype) = ?";
NSLog(@"char is %s",sqlStatement);

sqlite3_stmt *selectStmt;
if(sqlite3_prepare_v2(db, sqlStatement, -1, &selectStmt, NULL) == SQLITE_OK) {
     sqlite3_bind_text(sqlStatement, 1, [changeString UTF8String], -1, SQLITE_TRANSIENT);
     sqlite3_step(sqlStatement); // you should check the result of this too
}
sqlite3_finalize(sqlStatement);

このコードは、データベースが既に開かれていることを前提としています。

于 2012-10-31T06:46:01.597 に答える
0

既存のクラスを使用して SQLite データベースにアクセスしたい場合があります。私が書いた例をここで見つけることができます: https://github.com/AaronBratcher/ABSQLite

これには、従来のデータベースの方法で SQLite にアクセスするためのラッパー クラスがあり、これにより作業が容易になると感じています。

于 2013-07-11T17:04:16.253 に答える