Как я могу прочитать всю строку данных из SQLite с FMDB в IOS Dev? - PullRequest
4 голосов
/ 14 января 2012

Я могу прочитать все данные столбца из кода, как этот ...

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 ]

7 голосов
/ 14 января 2012

Для класса FMResultSet определен метод resultDict . Я бы сделал это так:

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

Это должно напечатать что-то вроде:

{
    Name = bbbbbird1;
    Age = 25;
}

для каждой строки в таблице PersonList. Теперь есть два способа поместить эти значения в массив. Одним из них является использование allValues ​​ метода NSDictionary , однако порядок столбцов, скорее всего, будет нарушен. Другой способ - создать массив самостоятельно:

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
)

Надеюсь, это то, что вы ищете. Вы можете поместить этот код в категорию FMResultsSet , если вам нужно, чтобы строки во многих местах в вашем приложении были массивами.

3 голосов
/ 23 июля 2015

Принятый ответ великолепен, но есть элегантный способ получить пример, приведенный ОП:

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]];
}
...