2015-06-14 20 views
7

Sto utilizzando SQLite in un'applicazione iOS e sto utilizzando FMDB come wrapper. Questo è il mio schema di database:Recupero di dati complessi tramite FMDB

CREATE TABLE Offer (code TEXT PRIMARY KEY NOT NULL, name TEXT); 

CREATE TABLE OffreMarket (codeOffer TEXT NOT NULL, 
codeMarket TEXT NOT NULL, 
FOREIGN KEY(codeOffer) REFERENCES Offer(code), 
FOREIGN KEY(codeMarket) REFERENCES Market(code)); 

CREATE TABLE Market (code TEXT PRIMARY KEY NOT NULL, name TEXT); 

miei oggetti del modello:

@interface Offer : NSObject 
@property (nonatomic,copy) NSString *code; 
@property (nonatomic,copy) NSString *name; 
@property (nonatomic,copy) NSArray *markets; 
@end 

@interface OffreMarket : NSObject 
@property (nonatomic,copy) NSString *codeOffer; 
@property (nonatomic,copy) NSString *codeMarket; 
@end 

@interface Market : NSObject 
@property (nonatomic,copy) NSString *code; 
@property (nonatomic,copy) NSString *name; 
@end 

Per esempio io sono andare a prendere tutte le offerte presenti nel database in questo modo:

- (NSArray *)offers { 
// Open database 

NSMutableArray *offers = [NSMutableArray new]; 

FMResultSet *resultSet = [database executeQuery:@"SELECT * FROM Offer"]; 
while ([resultSet next]){ 

    Offer *offer = [Offer new]; 
    offer.code = [resultSet stringForKey:@"code"]; 
    offer.name = [resultSet stringForKey:@"name"]; 

    // Get the markets for each offer 
    FMResultSet *marketResultSet = [database executeQuery:@"SELECT * FROM OffreMarket WHERE codeOffer = ?",offer.code]; 

    NSMutableArray *offers = [NSMutableArray new]; 
    while ([marketResultSet next]) { 
     OffreMarket *offerMarket = [OffreMarket new]; 
     .... 
    [offers addObject:offerMarket]; 
    } 

    market.offers = [offers copy]; 
} 

return [offers copy] 

} 

Questo è il lavoro, ma richiede tempo perché sto usando molte richieste SQL per recuperare tutte le offerte e i mercati corrispondenti.

Posso evitare molte richieste SQL per scaricare tutte le offerte con i mercati corrispondenti? Grazie per le vostre risposte

risposta

5

Quello che posso suggerire è:

  • Definisco l'istruzione SQL. Invece di 2 cicli, puoi semplicemente cambiare la tua affermazione in "SELECT * FROM OffreMarket WHERE codeOffer IN (SELECT code FROM Offer)". Se si desidera utilizzare la colonna "name" nella tabella "Offer", è possibile unire due tabelle "codeOffer" e "Offer". La regola generale qui è di evitare troppi cicli ma provare a combinare o perfezionare la tua dichiarazione SQL.

  • Creazione dell'indice per la colonna "code" nella tabella "Offer". Velocizzerà la tua ricerca molto. Ad esempio, una volta in uno dei miei progetti, ho dovuto lavorare su una tabella SQL con record 36K. Con un semplice indice impostato sulla colonna della chiave primaria, sono riuscito a ridurre il tempo di ricerca su quella tabella di 10 secondi.

+0

Grazie per la risposta. Potete per favore fornire un esempio di codice su come eseguire una richiesta SQL per recuperare le offerte e i mercati corrispondenti per ciascuna offerta? (Non capisco come analizzare lo stesso oggetto FMResultSet per avere le offerte e i mercati – samir

4

In questo caso è possibile ottenere i risultati con una sola query:

select * from Offer 
left outer join OffreMarket OM on (OM.codeOffer = Offer.code) 
2

Se si utilizza FMDB come un involucro che qui è la vostra risposta:

@try { 

    // Select Contact Details From Modules 
    NSString *selectSQL = [NSString stringWithFormat: 
          @"SELECT * FROM %@ INNER JOIN %@ ON %@.%@=%@.%@ ;", 
          OffreMarket, 
          Offer, 
          OffreMarket 
          code 
          Offer 
          code]; 

    //NSLog*(@"Get All Offers select SQL: %@", selectSQL); 
    FMResultSet *resultSet = [db executeQuery:selectSQL]; 
    NSMutableArray *marketOffers = [[NSMutableArray alloc]init]; 

    while ([resultSet next]) { 

     // Create Offers Details Modal 
     Offer *offer = [[Offer alloc] init]; 

     offer.code = [resultSet stringForKey:@"code"]; 
     offer.name = [resultSet stringForKey:@"name"]; 

     [marketOffers addObject: offer]; 
    } 
    return (NSArray *)infos; 
} 
@catch (NSException *exception) { 

    //NSLog*(@"%@ : %@",exception.name,exception.reason); 
    return nil; 
} 
return nil; 

Prova sopra Code..it ti fornirà tutti i dati nel minor tempo possibile. FMDB è una buona scelta per il funzionamento del database.

+0

Ma vorrei che le offerte (offerta) oggetti e tutte le relazioni correttive (intendo per ogni offerta objet la lista di OffreMarket) e il la stessa cosa per tutti gli oggetti di OffreMarket.Il tuo codice è solo il recupero degli oggetti Offer e non le relazioni corrispondenti. Chiaro? – samir

+0

vedi la mia risposta aggiornata. La query di inner join ti aiuterà a trovare la tua domanda. –

+0

E come analizzerai il risultato? – samir

Problemi correlati