2012-06-06 19 views
5

Ben tabloları bir ana ayrıntı tür yoluyla iterator çalışıyorum ve ben gitmek gibi ana/ayrıntı yapılarını doldurmak istiyorum. Ben KÖTÜ Erişim istisna bulunca yuva sonuç kümeleri Görünüşe: RS2 olaraksqlite3 ve fmdb iç içe FMResultSet mümkündür?

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

(ikinci sonuç kümesi) Ben FMDatabase sınıf içindeki EXEC_BAD_ACCESS olsun.

bu Sqlite3/fmdb bir kısıtlama var mı yoksa burada yanlış bir şey yapıyorum?

+0

Bir miktar hariç Kodunuzdaki yanlış bir şey görmüyorum * İkinci sorgu tanımında nil *. Özel durumun tam olarak nedenini araştırmak suretiyle sorunu daraltmanız gerekir. Bunu yapmanın bir yolu, kesme noktaları navigator'a gitmek ve soldaki küçük + düğmesine basarak tüm özel durumlar için kesme noktasını yerleştirmektir. Bu, istisna neden olan tam satırdaki yürütmeyi durdurmalıdır. – lawicko

+0

Evet, bunu yapıyordu ama hata olarak 'int' şeyi anlamaya biraz zaman aldı, neyse ... cevap için teşekkürler (benim gibi Java dünyadan gelenlere itibaren) yanıltıcı biraz oldu! –

cevap

2

Sadece yanlış yaptığını bulduk. İkinci sorgulamanın bir parçası olarak int geçiriyordum. Ben NSNumber dönüştürmek zorunda:

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

Böylece, gelir EVET, Sqlite3/fmdb iç içe sorgular desteklemiyor! :-)

0
Ben de FMDB ve SQLite3 kullanıyorum ve ben iç içe sorgular çalışmak bulmak

:

(I, biçimini iyi aldırma aşağıda kod ipucu lütfen iddia etmiyorum)

Ana ve Detay Her iki tabloda aslında '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 
    } 
} 

Bu hoş bir sürpriz oldu adında bir sütun var. İlk önce tüm ana kayıtları sorgulamayı bekledim ve daha sonra SQlite3'ten ayrıntıları almak için App hafızasına geçtim. Ancak yukarıdaki yapı iyi çalışıyor.