【问题标题】:Fetching complex data using FMDB使用 FMDB 获取复杂数据
【发布时间】:2015-08-30 08:51:58
【问题描述】:

我在 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 *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 请求获取相应市场的所有优惠吗?谢谢你的回答

【问题讨论】:

    标签: sql objective-c sqlite fmdb


    【解决方案1】:

    我可以建议的是:

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

    • 为表“Offer”中的列“code”创建索引。它将大大加快您的搜索速度。例如,有一次在我的一个项目中,我必须处理一个包含 36K 记录的 SQL 表。通过为主键列设置一个简单的索引,我设法将该表的搜索时间减少了 10 秒。

    【讨论】:

    • 感谢您的回答。您能否给出一个代码示例,如何执行一个 SQL 请求来获取每个报价的报价和相应的市场? (我不明白如何解析同一个对象 FMResultSet 以获得 Offer 和 Markets
    【解决方案2】:

    在这种情况下,您只需一个查询即可获得结果:

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

    【讨论】:

      【解决方案3】:

      如果您使用 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;
      

      试试上面的代码..它将在最短的时间内为您获取所有数据。 FMDB 是数据库操作的不错选择。

      【讨论】:

      • 但是我想要提供(Offer)对象和所有对应的关系(我的意思是每个Offre 对象的OffreMarket 列表)和所有OffreMarket 对象的相同的东西。您的代码只是获取 Offer 对象而不是对应关系。清除?
      • 查看我的更新答案。内连接查询将帮助您找出您的问题。
      • 你将如何解析结果集?
      • 您将在 NSArray 中获取所有数据,而不是使用键值编码或 From NSObject Modal 您可以从 NSArray 中获取数据。
      • 我的问题是如何获得:@property (nonatomic,copy) NSArray *markets;每个报价(Offer)对象。
      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2017-03-17
      相关资源
      最近更新 更多