2015-06-14 15 views
7

Używam SQLite w aplikacji na iOS i używam FMDB jako opakowania. To jest mój schemat bazy danych:Pobieranie złożonych danych przy użyciu 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); 

mojego modelu obiektów:

@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 

Na przykład ja ściągam wszystkie oferty w bazie danych tak:

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

} 

to działa, ale to wymaga czasu, ponieważ korzystam z wielu zapytań SQL w celu pobrania wszystkich Ofert i odpowiednich Rynków.

Czy mogę uniknąć wielu żądań SQL, aby pobrać wszystkie oferty z odpowiednimi rynkami? Dzięki za odpowiedzi

Odpowiedz

5

Co mogę zaproponować to:

  • zdefiniować SQL. Zamiast 2 pętli, możesz po prostu zmienić swoje oświadczenie na "SELECT * FROM OffreMarket WHERE codeOffer IN (SELECT code FROM Offer)". Jeśli chcesz użyć kolumny "name" w tabeli "Offer", możesz dołączyć dwie tabele "codeOffer" i "". Zasadą jest tutaj unikanie zbyt wielu pętli, ale spróbuj połączyć lub udoskonalić swoje instrukcje SQL.

  • Utwórz indeks dla kolumny "code" w tabeli "Offer". Przyspieszy to twoje poszukiwania. Na przykład, raz w jednym z moich projektów musiałem pracować na tabeli SQL z rekordami 36K. Dzięki prostemu indeksowi ustawionemu na kolumnę klucza głównego udało mi się skrócić czas wyszukiwania na tym stole o 10 sekund.

+0

Dzięki za odpowiedź. Czy możesz podać przykład kodu, jak wykonać jedno zapytanie SQL, aby pobrać oferty i odpowiednie rynki dla każdej oferty? (Nie rozumiem, jak analizować ten sam obiekt, FMResultSet, aby mieć oferty i rynki – samir

4

W tym przypadku można uzyskać wyniki z zaledwie jednym zapytaniu:

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

Jeśli używasz FMDB jako owijki niż tutaj jest odpowiedź:

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

Spróbuj powyżej Kod..it dostarczy Ci wszystkie dane w minimalnym czasie. FMDB to dobry wybór do obsługi baz danych.

+0

, ale chciałbym, aby oferty (oferta) obiektów i wszystkie stosowne relacje (mam na myśli dla każdej oferty objet liste OffreMarket) i to samo dotyczy wszystkich obiektów OffreMarket, Twój kod pobiera tylko obiekty Offer, a nie odpowiednie relacje. Wyczyść? – samir

+0

zobacz moją zaktualizowaną odpowiedź Zapytanie z zapytaniem wewnętrznym pomoże ci znaleźć twoje pytanie –

+0

A jak przeanalizować zestaw wyników? – samir