2012-06-06 13 views
5

Próbuję iteratora za pośrednictwem głównego rodzaju tabel i chciałbym zapełnić struktury master/detail, jak przejść. Podobno kiedy zestawy wyników gniazdo mam zły wyjątek dostępu:Zestaw FMResultSet sqlite3 i fmdb jest możliwy?

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

W tych RS2 (drugi zestaw wyników) otrzymuję EXEC_BAD_ACCESS w klasie FMDatabase.

Czy jest to ograniczenie sqlite3/fmdb, czy też robię coś nie tak?

+0

Nie widzę niczego złego w kodzie poza jednym małym * zerem * w definicji drugiego zapytania. Musisz zawęzić problem, sprawdzając, co dokładnie powoduje wyjątek. Jednym ze sposobów na to jest przejście do nawigatora punktów przerwania i umieszczenie punktu przerwania we wszystkich wyjątkach przez naciśnięcie małego przycisku + w lewym dolnym rogu. Powinno to zatrzymać wykonywanie w wierszu, który powoduje wyjątek. – lawicko

+0

Tak, robiłem to, ale zajęło mi trochę czasu, aby wymyślić "int", ponieważ błąd był trochę mylący (od tych, którzy pochodzą ze świata java jak ja) ... W każdym razie, dziękuję za odpowiedź! –

Odpowiedz

2

Właśnie znalazłem, co zrobiłem źle. Podałem int jako część drugiego zapytania. Miałem go przekonwertować do 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]; 

To znaczy, YES, sqlite3/fmdb obsługuje zagnieżdżone zapytania! :-)

0

Używam FMDB i Sqlite3 jak dobrze i uważam zagnieżdżonych zapytań działa:

(Nie twierdzę wskazówkę kodu poniżej jest dobre, nigdy nie przeszkadza format, proszę)

Zarówno Mistrz i szczegółów tabele mają kolumnę o nazwie „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 
    } 
} 

To było miłe zaskoczenie, rzeczywiście. W połowie spodziewałem się, że najpierw będę musiał przetestować wszystkie rekordy główne, a następnie przejrzę je w pamięci aplikacji, aby poznać szczegóły z SQlite3. Ale powyższy konstrukt działa dobrze.

Powiązane problemy