これは奇妙な問題です。機能する回避策を見つけましたが、コードの後半で再び現れると思われるため、その理由を理解したいと思います。私に問題を与えている方法は次のとおりです。
FMDatabase *cardDatabase // initialized elsewhere
NSString *cleanChar; // this is the sanitized query string
NSString *cardQueryString;
int cardID;
switch ([self studyLanguage])
{
case CSStudyLanguageMandarinTraditional:
cardQueryString = @"SELECT rowid, * FROM trad_char WHERE search = ";
break;
// [...other cases...]
}
cardQueryString = [cardQueryString stringByAppendingString:cleanChar];
[cardDatabase open];
FMResultSet* cardSet = [cardDatabase executeQuery:cardQueryString];
BOOL foundCard = NO;
while ([cardSet next])
{
foundCard = YES;
cardID = [cardSet intForColumn:@"rowid"];
}
[cardDatabase close];
このコードは、データベース エラーを返します。
DB Error 1: no such column: 意
ここで、「意」は cleanChar に渡す文字シーケンスで、どうやら値ではなく列として扱われているようです。ただし...クエリステップで検索文字を追加すると、次のようになります。
cardQueryString = @"SELECT rowid, * FROM trad_char WHERE search = ?";
FMResultSet* cardSet = [cardDatabase executeQuery:cardQueryString, cleanChar];
すべてがうまく機能します。
だから私は実際に問題を解決しました...しかし、私はその理由を知りたいと思っています.最後に変数。
そう: これは FMDatabase のバグですか? FMDatabase の使い方がわからないだけですか? または、コードに他の問題がありますか?