sqlite3 和 fmdb 嵌套 FMResultSet 是可能的吗?
Posted
技术标签:
【中文标题】sqlite3 和 fmdb 嵌套 FMResultSet 是可能的吗?【英文标题】:sqlite3 and fmdb nested FMResultSet is possible? 【发布时间】:2012-06-06 11:42:04 【问题描述】:我正在尝试通过主要详细信息类型的表进行迭代,并且我想在进行时填充主要/详细信息结构。显然,当我嵌套结果集时,我得到一个 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 的限制还是我在这里做错了什么?
【问题讨论】:
除了第二个查询定义中的一个小 nil 之外,我在您的代码中没有发现任何错误。您需要通过调查导致异常的确切原因来缩小问题范围。一种方法是转到断点导航器并通过按左下角的小 + 按钮将断点放置在所有异常上。这应该会在导致异常的确切行中停止执行。 是的,我正在这样做,但我花了一段时间才弄清楚“int”的问题,因为错误有点误导(来自像我这样来自 Java 世界的人)......无论如何,感谢您的回复! 【参考方案1】:我刚刚发现我做错了什么。作为第二个查询的一部分,我传递了一个 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 确实支持嵌套查询! :-)
【讨论】:
【参考方案2】:我也在使用 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 中获取详细信息。 但上述构造工作正常。
【讨论】:
以上是关于sqlite3 和 fmdb 嵌套 FMResultSet 是可能的吗?的主要内容,如果未能解决你的问题,请参考以下文章