如何在IOS dev中读取带有FMDB的SQLite中的整行数据?

时间:2012-01-14 07:05:16

标签: ios sqlite fmdb

我可以从这样的代码中读取所有列数据......

FMResultSet *rs = [db executeQuery:@"SELECT Name, Age, FROM PersonList"];

while ([rs next]) {

NSString *name = [rs stringForColumn:@"Name"];

int age = [rs intForColumn:@"Age"];

}

或以这种方式找到一些数据

NSString *address = [db stringForQuery:@"SELECT Address FROM PersonList WHERE Name = ?",@"John"];

但是如果我想要一个数组内容整行的数据(假设我的所有行数据都是一个简单的字符串)

我怎样才能实现......?

感谢您的帮助!

您也可以用中文回答我,谢谢您

2 个答案:

答案 0 :(得分:7)

FMResultSet 类上定义了 resultDict 方法。我会这样做:

FMResultSet *rs = [db executeQuery:@"SELECT Name, Age, FROM PersonList"];
while ([rs next]) {
    NSLog(@"%@", [[rs resultDict] description]);
}

这应该打印如下:

{
    Name = bbbbbird1;
    Age = 25;
}

表示PersonList表中的每一行。现在有两种方法可以将这些值放入数组中。一种是使用 NSDictionary allValues 方法,但是列的顺序很可能会被破坏。另一种方法是自己构建数组:

FMResultSet *rs = [db executeQuery:@"SELECT Name, Age, FROM PersonList"];
while ([rs next]) {
    NSMutableArray* rowData = [[NSMutableArray alloc] init];
    for(int i=0; i<[s columnCount]; i++) {
        [rowData addObject:[[rs resultDict] objectForKey:[[rs columnNameForIndex:i] lowercaseString]];
    }
    NSLog(@"%@", [rowData description]);
}

上面应该打印:

(
    bbbbbird1,
    25
)

我希望这就是你要找的东西。如果您需要在您的app中的许多位置将行作为数组,则可以将此代码放在 FMResultsSet 类别中。

答案 1 :(得分:3)

接受的答案很棒但是有一种优雅的方式来实现OP给出的例子:

FMResultSet *rs = [db executeQuery:customQuery];
while ([rs next]) {
   NSString* tempName = [rs objectForColumnName:@"someColumnName"];
}

根据objectForColumnName文档返回值:

  

NSNumber,NSString,NSData或NSNull。如果列为NULL,则返回[NSNull null]对象。

因此可以使用单一方法(假设您知道数据库的类型)来实现。

此外,如果您正在寻找包含类对象的自定义数组,您可以将它们组合在一起:

FMResultSet *rs = [db executeQuery:customQuery];
while ([rs next]) {
   someCustomClassName *tempClass = [[someCustomClassName alloc] init];
   [tempClass setSomePropertyValue:[rs objectForColumnName:@"someColumnName"];
   [someArray addObject:tempClass]];
}