如何使用objective-c中的fmdb遍历sqlite中的所有列

问题描述 投票:1回答:2

我需要对所有列进行搜索,因此我不想在where子句中指定每个列名,而是创建一个可以搜索所有列的方法。

-(void) fillSomeobjectNames:(NSString *)filter
{
    FMDatabase *db = [FMDatabase databaseWithPath:databasePath];

    [db open];

    NSString *sql = [NSString stringWithFormat:@"SELECT id, name, imagefile FROM %@ %@", mainTableName, filter];
    FMResultSet *results = [db executeQuery:sql];
    while([results next]) 
    {
        Someobject *someobject = [[Someobject alloc] init];
        [someobject setID:[results intForColumn:@"id"]];
        [someobject setName:[results stringForColumn:@"name"]];
        NSString *iconName = [[results stringForColumn:@"imagefile"] stringByReplacingOccurrencesOfString:@".jpg" withString:@""];
        [someobject setIconPath:[NSString stringWithFormat:@"%@-ico.jpg",iconName]];
        [someobjects someobject];
    }

    [db close];
}

'filter'可以是'WHERE remark = [searchText] AND description = [searchText]依此类推......

fmdb
2个回答
8
投票

我不认为这可以使用单个SELECT语句完成。获取列名称的最佳方法是PRAGMA table_info(table_name),遗憾的是这不能在SELECT语句中使用,因此您需要一个额外的SELECT来获取列名,然后您可以构建您的SQL并执行您想要的操作:

-(void) fillSomeobjectNames:(NSString *)filter
    {
        FMDatabase *db = [FMDatabase databaseWithPath:databasePath];

        [db open];

        FMResultSet columnNamesSet* = [db executeQuery:[NSString stringWithFormat:@"PRAGMA table_info(%@)", mainTableName]];
        NSMutableArray* columnNames = [[NSMutableArray alloc] init];
        while ([columnNamesSet next]) {
            [columnNames addObject:[columnNamesSet stringForColumn:@"name"]];
        }
        // put whatever you need to look for as mySearchPhrase
        NSString* partToAppend = [NSString stringWithFormat:@"=%@ OR ", @"mySearchPhrase"];
        NSString* filter = [columnNames componentsJoinedByString:partToAppend];
        filter = [filter stringByAppendingString:[NSString stringWithFormat:@"=%@", @"mySearchPhrase"]];

        // now your sql would look like this
        NSString *sql = [NSString stringWithFormat:@"SELECT id, name, imagefile FROM %@ WHERE %@", mainTableName, filter];
        FMResultSet *results = [db executeQuery:sql];
        while([results next]) 
        {
            Someobject *someobject = [[Someobject alloc] init];
            [someobject setID:[results intForColumn:@"id"]];
            [someobject setName:[results stringForColumn:@"name"]];
            NSString *iconName = [[results stringForColumn:@"imagefile"] stringByReplacingOccurrencesOfString:@".jpg" withString:@""];
            [someobject setIconPath:[NSString stringWithFormat:@"%@-ico.jpg",iconName]];
            [someobjects someobject];
        }

        [db close];
    }

请注意,我将WHERE字移出过滤器,我也使用OR而不是AND,这是我认为你打算做的。

另外要记住的是每列中的数据类型。您将每个字符串与字符串进行比较,但是您的表格中的每一列都是文本类型吗?我使用的pragma语句也返回给定列的类型(在名为type的列中),因此您可以使用它来过滤text类型的列。


0
投票

感谢上面的回答,快照代码为swift 3.此代码显示表的所有列。

    let db = FMDatabase(path: Util.getPath(databasePath))
    guard db != nil else { return }

    db!.open()

   let resultSet: FMResultSet! = db!.executeQuery("PRAGMA table_info(tableName)",withArgumentsIn: nil)

   let marrInfo : NSMutableArray = NSMutableArray()
   if (resultSet != nil) {
       while resultSet.next() {
           let aDict : NSMutableDictionary = NSMutableDictionary()
           aDict.setValue(resultSet.string(forColumn: "cid"), forKey: "cid")
           aDict.setValue(resultSet.string(forColumn: "name"), forKey: "name")
           aDict.setValue(resultSet.string(forColumn: "type"), forKey: "type")
           aDict.setValue(resultSet.string(forColumn: "notnull"), forKey: "notnull")
           aDict.setValue(resultSet.string(forColumn: "pk"), forKey: "pk")
           print(aDict)
           marrInfo.add(aDict)
       }
   }
   db!.close()
© www.soinside.com 2019 - 2024. All rights reserved.