简体   繁体   English

sqlite3和fmdb嵌套的FMResultSet是可能的吗?

[英]sqlite3 and fmdb nested FMResultSet is possible?

I'm trying to iterator through a master detail sort of tables and I'd like to populate the master/detail structures as I go. 我正在尝试通过一个主要的细节表来迭代,我想在我去的时候填充主/详细结构。 Apparently when I nest result sets I get a BAD Access exception: 显然,当我嵌套结果集时,我得到一个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];

In the rs2 (second result set) I get the EXEC_BAD_ACCESS within FMDatabase class. 在rs2(第二个结果集)中,我在FMDatabase类中获得了EXEC_BAD_ACCESS。

Is this a restriction of sqlite3/fmdb or am I doing something wrong here? 这是sqlite3 / fmdb的限制还是我在这里做错了什么?

I just found what I did wrong. 我刚刚发现了我做错了什么。 I was passing a int as part of the second query. 我正在传递一个int作为第二个查询的一部分。 I had to convert it to NSNumber: 我不得不将其转换为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];

So that means, YES, sqlite3/fmdb does support nested queries! 这意味着,YES,sqlite3 / fmdb确实支持嵌套查询! :-) :-)

I'm using FMDB and SQLITE3 as well, and I find nested queries work: 我也在使用FMDB和SQLITE3,我发现嵌套查询有效:

(I'm not claiming the code hint below is good, never mind the format, please) (我没有声称下面的代码提示是好的,请不要介意格式,请)

Both Master and Detail tables have a column called 'id' 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 
    }
}

This was a pleasant surprise, actually. 实际上,这是一个惊喜。 I was halfways expecting to have to first query all master records, and then loop through them in App memory to pick up the details from SQlite3. 我半途而废,希望首先查询所有主记录,然后在App内存中循环访问它们以从SQlite3中获取详细信息。 But the above construct works fine. 但上面的结构工作正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM