【问题标题】:FMDB - Select statement using an array of valuesFMDB - 使用值数组的选择语句
【发布时间】:2014-02-13 08:34:24
【问题描述】:

数组 (arrayBottleID3) 具有可变数量的 INT 值。我想返回(results / arrayBottleNames)返回结果。

arrayBottleID3 可能有 3 个 INT 值,我不想执行 3 个不同的查询语句。我不知道 arrayBottleID3 有什么值或多少。

arrayBottleID3 可以有 1 或 100 个 INT 值。

下面不起作用。我收到错误或它不返回任何内容。

我只是不知道使用 withArugmentsInArray 的确切语法是什么。 我知道这不是 .. bottleID = ?或瓶子 ID (?)。

谁能给我举个例子?

[self OpenDB]    


 results = [database executeQuery:@"SELECT friendlyname FROM Inventory WHERE bottleID = ?" withArgumentsInArray:@[arrayBottleID3]];

while([results next])
{
    [arrayBottleNames addObject:[results stringForColumn:@"friendlyname"]];

}

[database close];

NSLog(@"count %d", [arrayBottleNames count]);
NSLog(@"Names: %@",arrayBottleNames);

【问题讨论】:

    标签: objective-c arrays sqlite select fmdb


    【解决方案1】:

    您的 SQL 应该是:

    SELECT friendlyname FROM Inventory WHERE bottleID IN (?, ?, ?)
    

    对于数组中的每个元素,您将需要 1 个?,因此您应该执行以下操作:

    NSMutableArray *placeHolders = [NSMutableArray arrayWithCapacity:[sourceArray count]];
    for (int i=0; i<[sourceArray count]; i++) {
        [placeHolders addObject:@"?"];
    }
    NSString *placeHolderString = [placeHolders componentsJoinedByString:@", "];
    
    NSString *query = [NSString stringWithFormat:@"SELECT * FROM MyTable WHERE myField IN (%@)", placeHolderString];
    FMResultSet *rs = [db executeQuery:query withArgumentsInArray:sourceArray];
    

    【讨论】:

      【解决方案2】:

      我在 Swift 中使用以下方法来创建 ?,?,?,?... 字符串:

      let bindStr = join(",", Array(count: sourceArray.count, repeatedValue: "?"))
      if let rs = db.executeQuery("SELECT * FROM MyTable WHERE myField IN (\(bindStr))", withArgumentsInArray: sourceArray) { ... handle result set... }
      

      只需将sourceArray 替换为您自己的即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 2013-08-11
        • 2013-10-06
        • 2012-12-12
        • 2010-12-18
        相关资源
        最近更新 更多