2015-06-14 38 views
7

我在iOS应用程序中使用SQLite,我使用FMDB作为包装。这是我的数据库架构:使用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); 

我的模型对象:

@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 

比如我获取数据库中的所有报价是这样的:

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

} 

这是工作,但它需要时间,因为我正在使用许多SQL请求来获取所有优惠和相应的市场。

我可以避免很多SQL请求获取相应市场的所有优惠吗?谢谢您的回答

回答

5

我可以建议是:

  • 优化您的SQL语句。您可以简单地将您的语句更改为“SELECT * FROM OffreMarket WHERE codeOffer IN (SELECT code FROM Offer)”,而不是2个循环。如果要使用表“Offer”中的列“name”,则可以加入两个表“codeOffer”和“Offer”。这里的经验法则是为了避免太多的循环,但尝试组合或优化你的SQL语句。

  • 在表“Offer”的列中创建索引“code”。它会加快你的搜索速度。例如,在我的一个项目中,我不得不在一个有36K记录的SQL表上工作。通过设置主键列的简单索引,我设法将该表的搜索时间缩短了10秒。

+0

感谢您的回答。您能否给出一个代码示例如何执行一个SQL请求以获取每个报价的报价和相应的市场? (我不明白如何解析同一个对象FMResultSet以获得优惠和市场 – samir

4

在这种情况下,你可以只用一个查询的结果:

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

如果您正在使用FMDB作为包装比这里是你的答案:

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

尝试以上Code..it会在最短时间内为您提供所有数据。 FMDB是数据库操作的不错选择。

+0

但是我希望提供(Offer)对象和所有相关关系(我的意思是每个Offer都对应OffreMarket的听众)和您的代码只是提取Offer对象而不是相应的关系。清除? – samir

+0

查看我的更新回答。内部连接查询将帮助您找出您的问题。 –

+0

您将如何解析resultSet? – samir