sql – 使用FMDB获取复杂数据

我在iOS应用程序中使用sqlite,我使用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 *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请求来获取相应市场的所有商品吗?谢谢你的回答

解决方法

我可以建议的是:

>优化您的sql语句.您可以简单地将语句更改为“SELECT * FROM OffreMarket WHERE codeOffer IN(SELECT code FROM Offer)”,而不是2个循环.如果要在表“Offer”中使用列“name”,则可以连接两个表“codeOffer”和“Offer”.这里的经验法则是避免过多的循环,但尝试组合或优化您的sql语句.>在表“Offer”中为列“code”创建索引.它会加快你的搜索速度.例如,在我的一个项目中,我必须处理具有36K记录的sql表.通过将简单索引设置为主键列,我设法将该表上的搜索时间缩短了10秒.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03