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

时间:2016-01-21 17:49:08

标签: ios sqlite fmdb

我正在尝试查询在特定列中包含字符串的行。但是,我无法得到理想的结果。

代码:

 [_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时,控制台会说:( FMResultsSet nilnotesnilnotesid='%d'

  

数据库错误1:接近“%”:语法错误

我也试过在=和%d之间给出一个空格

当我使用:FMResultsSet时,控制台会说:( nil notes不是nilnotesid='?'notesid=?

  

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

当我使用:obj = va_arg(args, id);时,控制台会说

  

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

当我使用:FMDatabse.m时,应用会在[_database executeQuery:[NSString stringWithFormat:@"select * from testNotes where notesid='%d'",notesID]]; 文件中var nodesToVisit = [{id:1, children:[2,3]}]; // 1 is the root visitNextBatch(); function visitNextBatch() { var copyOfNodes = nodesToVisit; nodesToVisit = []; Promise.each(copyOfNodes, val => { console.log(val.id); if(val.children) { val.children.forEach(child => { var getChildFromDatabasePromise = myDatabase.get(child); nodesToVisit.push(getChildFromDatabasePromise); }); } }).then(function() { visitNextBatch(); }) } 崩溃

我也试过这个:

d = {
"modID1":
    {
        "sequences1": {"header1": 3},
        "sequences2": {"header2": 5},
        "sequences3": {"header3": 1}
    },
"modID2":
    {
        "sequences1": {"header1": 1},
        "sequences2": {"header2": 8},
    },
}
result = {
    k: OrderedDict(
        sorted(
            v.items(),  # "sequences1": {"header1": 3},"sequences2":     {"header2": 5},"sequences3": {"header3": 1}
            key=lambda h: next(  # h is  (sequences1,{"header1": 3})
                iter(
                    h[1].values()  # h[1] is {"header1": 3}
                )
            ),
            reverse=True
        )
    ) for k, v in d.items()}

print(result)

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

正如Mr.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];