5

我正在尝试通过主要详细信息类型的表进行迭代,并且我想在进行时填充主要/详细信息结构。显然,当我嵌套结果集时,我得到一个 BAD Access 异常:

FMDatabase *db = self.database;
[db open];
db.traceExecution = YES;
db.logsErrors = YES;
FMResultSet *rs = [db executeQuery:@"select group_id, label from main.preference_group order by group_id"];
while ([rs next])
{
    PreferenceGroup *pg = [[PreferenceGroup alloc] init];
    pg.group_id = [rs intForColumn:@"group_id"];
    pg.label = [rs stringForColumn:@"label"];
    pg.translatedLabel = NSLocalizedString(pg.label, nil);
    NSMutableArray * prefs = [[NSMutableArray alloc] init];
    [prefGroups addObject:prefs];
    FMResultSet *rs2 = [db executeQuery:@"select pref_id, label, value from main.preference where group_id = ? order by pref_id", pg.group_id, nil];
        while ([rs2 next])
        {
            Preference * pref = [[Preference alloc] init];
            pref.group_id = pg.group_id;
            pref.pref_id = [rs2 intForColumn:@"pref_id"];
            pref.label = [rs2 stringForColumn:@"label"];
            pref.value = [rs2 stringForColumn:@"value"];
            pref.translatedLabel = NSLocalizedString(pref.value, nil);
            [prefs addObject:pref];
        }
        [rs2 close];
    }
    [rs close];
    [db close];

在 rs2(第二个结果集)中,我得到了 FMDatabase 类中的 EXEC_BAD_ACCESS。

这是对 sqlite3/fmdb 的限制还是我在这里做错了什么?

4

2 回答 2

2

我刚刚发现我做错了什么。作为第二个查询的一部分,我传递了一个 int 。我必须将其转换为 NSNumber:

            FMResultSet *rs2 = [db executeQuery:@"select pref_id, label, value from main.preference where group_id = ? order by pref_id", [NSNumber numberWithInt:pg.group_id], nil];

这意味着,是的,sqlite3/fmdb 确实支持嵌套查询!:-)

于 2012-06-07T11:45:01.770 回答
0

我也在使用 FMDB 和 SQLITE3,我发现嵌套查询有效:

(我并不是说下面的代码提示很好,请不要介意格式)

Master 和 Detail 表都有一个名为“id”的列

FMResultSet *rso = [database executeQuery:@"select * from master order by id"];
while ([rso next])
{
    NSInteger masterId = [rso intForColumn:@"id"];
    NSString *q3 = [[NSString alloc] initWithFormat:
               @"select * from detail where masterid = %d order by id", masterId, nil ];

    FMResultSet *rsa = [database executeQuery:q3 ];

    while ([rsa next])
    {
        NSInteger detailId   = [rsa intForColumn:@"id"];
        //
        // here do something with masterId and detailId 
    }
}

实际上,这是一个令人愉快的惊喜。我一半期望必须首先查询所有主记录,然后在应用程序内存中循环它们以从 SQlite3 中获取详细信息。但上述构造工作正常。

于 2013-03-20T19:28:29.843 回答