如何使用 FMDB 在 iOS 中使用整数参数查询 SQlite



我正在尝试查询在特定列中具有字符串的行。但是,我无法获得预期的结果。

法典:

 [_database open];
FMResultSet *results = [_database executeQuery:@"select * from testNotes where notesid=%d",notesID];
NSString *notes=[results stringForColumn:@"notes"];
if ([_database hadError]) {
    NSLog(@"DB Error %d: %@", [_database  lastErrorCode], [_database lastErrorMessage]);
}
[_database close];

我使用 sqlite 浏览器检查了数据。我发送的值是 13,并且数据存在于表中。

当我使用时:notesid=%d控制台说:(这里FMResultsSetnilnotesnil

数据库错误 1:靠近"%":语法错误

我还尝试在 = 和 %d 之间提供一个空格

当我使用时:notesid='%d'控制台说:(这里FMResultsSet不是nilnotesnil

数据库错误 25:绑定或列索引超出范围

当我使用时:控制台notesid='?'

数据库错误 25:绑定或列索引超出范围

当我使用时:notesid=?应用程序在FMDatabse.m文件中的obj = va_arg(args, id);崩溃

我也试过这个:

[_database executeQuery:[NSString stringWithFormat:@"select * from testNotes where notesid='%d'",notesID]];

基于整数值查询行的正确方法是什么?

executeQuery期望所有参数都是Objective-C对象。但是,notesID 是一个整数,因此不是对象。为了解决此问题,您需要将notesID包装在如下所示的NSNumber对象中:

FMResultSet *results = [_database executeQuery:@"select * from testNotes where notesid=?", @(notesID)];

正如Mage先生所建议的,我需要将int值包装在NSNumber中。而且,我需要添加

  while([results next]) {
    notes = [results stringForColumn:@"notes"];
}

没有这个while循环,我无法获得所需的结果。

现在工作代码将是:

 [_database open];
FMResultSet *results = [_database executeQuery:@"select * from testNotes where notesid= ?",@(notesID)];
NSString *notes;
while([results next]) {
    notes = [results stringForColumn:@"notes"];
}
if ([_database hadError]) {
    NSLog(@"DB Error %d: %@", [_database  lastErrorCode], [_database lastErrorMessage]);
}
[_database close];

最新更新