1

我需要对所有列进行搜索,因此我不想在 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] AND 等等......'

4

2 回答 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];
    }

请注意,我将WHEREword 从过滤器中移出,并且我使用OR了而不是AND,这是我认为您打算做的。

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

于 2012-01-14T19:50:51.293 回答
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()
于 2017-12-21T13:03:32.257 回答