2012-06-06 17 views
5

我想通過一個主要的詳細排序表的迭代器,我想隨着我去填充主/細節結構。顯然,當我巢結果集我得到一個壞的訪問異常:sqlite3和fmdb嵌套FMResultSet是可能的嗎?

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的限制還是我在這裏做錯了什麼?

+0

我在你的代碼中看不到任何錯誤,除了第二個查詢定義中的一個* nil *。您需要通過調查究竟是什麼導致異常來縮小問題範圍。一種方法是去斷點導航器,並通過按下左下角的小按鈕將斷點放在所有異常處。這應該在導致異常的確切行中停止執行。 – lawicko

+0

是的,我正在這樣做,但我花了一段時間才弄清'int'的事情,因爲錯誤有點誤導(來自像我這樣的Java世界的人)......無論如何,感謝您的回覆! –

回答

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支持嵌套查詢! :-)

0

我使用FMDB和SQLITE3還有,我覺得嵌套查詢工作:

(我不是說代碼提示下面是好的,沒關係的格式,請)

兩個主從表中有一個名爲「身份證」

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 
    } 
} 

這是一個驚喜列,其實。我半路要求首先查詢所有主記錄,然後在App內存中循環查看所有主記錄,以便從SQlite3中獲取詳細信息。 但上面的構造工作正常。